home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / DIV / MM2TINYS.M < prev    next >
Encoding:
Text File  |  1994-06-03  |  104.7 KB  |  3 lines

  1. ⓪ MODULE MM2TinyShell; (*$Z+,P+,V+,R-*)⓪ ⓪ (*⓪!*----------------------------------------------------------------------------⓪!* Copyright Februar 1987 Thomas Tempelmann & Manuel Chakravarty⓪!*----------------------------------------------------------------------------⓪!* Modul-Beschreibung : GEM-Tiny-Shell für MOS / Megamax Modula-2⓪!*----------------------------------------------------------------------------⓪!* Version            : 2.3g        /     Interne Version: V#0117⓪!*----------------------------------------------------------------------------⓪!* MCH: Manuel Chakravarty⓪!* TT:  Thomas Tempelmann⓪!* MS:  Michael Seyfried, Unterer Mauergarten 17, D-W6520 Worms 24⓪!*----------------------------------------------------------------------------⓪!* Datum   Version  Autor  Bemerkung (Arbeitsbericht)⓪!*----------------------------------------------------------------------------⓪!* 01.12.90  2.1p   MCH    Übernahme aller Teile der MM2Shell, die keine ⓪!*                         Fenster benutzen⓪!* 03.12.90  2.1p   MCH    Neue Workfilebehandlung und neue Resource⓪!* 07.12.90  2.2    TT     Anpassung an MM2Shell 2.2⓪!* 07.04.91  2.2b   TT     Höhe der Menüzeile korrigiert; ACCs werden vor/nach⓪!*                         Start von Programmen geschlossen;⓪!*                         Batch-Befehle "POSTAMBLE1/2" zum Starten von Prgs⓪!*                         vor Verlassen der Shell; ExitSS-Aufruf am Ende des⓪!*                         Moduls _hinter_ den ShellWrite-Aufruf verlegt;⓪!*                         Codename von Workfiles wird nun korrekt behalten.⓪!* 20.05.91  2.2d   TT     Bei manueller Arbeitsdateieingabe wird die Datei⓪!*                         auf den Source-Pfaden gesucht.⓪!* 20.10.91  2.3    TT     Linker-Option-Box ermöglicht Symboldatei-Erzeugung.⓪!*                  MS     Shell nun MultiGEM-fähig, dazu 'call' überarbeitet.⓪!* 14.01.93  2.3e   TT⓪!*----------------------------------------------------------------------------⓪!*)⓪ ⓪ ⓪ (*  Qualified imports for 'ShellShell'  *)⓪ ⓪ IMPORT Clock, ModCtrl,⓪ ⓪'GEMBase, AESMisc,⓪'GrafBase, GEMGlobals, GEMEnv,⓪'AESForms, AESObjects, AESResources, AESGraphics, AESMenus,⓪'AESWindows, AESEvents,⓪'ObjHandler, EventHandler, EasyGEM0, EasyGEM1;⓪ ⓪ ⓪ FROM SYSTEM     IMPORT LONGWORD, WORD, ADDRESS, BYTE,⓪7ASSEMBLER, ADR, LOAD, STORE;⓪ ⓪ IMPORT Mm2tinysRsc;  (* RSC-Datei *)⓪ ⓪ FROM RealCtrl   IMPORT AnyRealFormat, UsedFormat;⓪ ⓪ FROM StrConv    IMPORT CardToStr, IntToStr, StrToLCard, StrToCard,⓪7StrToInt, LHexToStr;⓪ ⓪ FROM Loader     IMPORT LoaderResults, DefaultStackSize,⓪7LoadModule, CallModule, UnLoadModule;⓪ ⓪ FROM PathEnv    IMPORT HomeReplaced, HomeSymbol, ReplaceHome, HomePath;⓪ FROM PathCtrl   IMPORT PathList;⓪ FROM Paths      IMPORT SearchFile, ListPos;⓪ ⓪ FROM Storage    IMPORT ALLOCATE, DEALLOCATE, MemAvail, AllAvail, Inconsistent;⓪ ⓪ FROM Strings    IMPORT PosLen, String, Relation, Compare, Space, Upper, Empty,⓪7EatSpaces, Append, StrEqual, Delete, Concat, Assign,⓪7Split, Insert, Length, Copy, Pos;⓪ ⓪ IMPORT Lists;⓪ ⓪ IMPORT SysUtil0;⓪ ⓪ FROM MOSConfig IMPORT StdDateMask;⓪ IMPORT MOSConfig;⓪ ⓪ IMPORT MOSCtrl;⓪ ⓪ FROM MOSGlobals IMPORT MemArea, BusFault, OddBusAddr, NoValidRETURN,⓪7OutOfStack, FileStr, PathStr, NameStr,⓪7fOK, fFileNotFound, fDriveNotReady, fWriteProtected,⓪7fPathNotFound, fInvalidDrive, fAccessDenied,⓪7fTooManyOpen, fInsufficientMemory,⓪7Drive, DriveSet, fEOF;⓪ ⓪ FROM ShellMsg   IMPORT ScanMode, ScanAddr, TextName, ErrorMsg, DefPaths,⓪7ModPaths, ErrListFile, ImpPaths, SrcPaths, DefSfx,⓪7ImpSfx, ModSfx, CodeName, Active, LinkDesc, ⓪7LLRange, ScanIndex, TextLine, TextCol,⓪7MakeFileName, TemporaryPath, MainOutputPath,⓪7DefLibName, DefOutPath, ImpOutPath, ModOutPath,⓪7ShellPath, ImpSrcSfx, ModSrcSfx, DefSrcSfx, CodeSize,⓪7StdPaths, CompilerArgs, CompilerParm, ScanOpts,⓪7LinkMode, LinkerParm, EditorParm;⓪ ⓪ IMPORT Directory;⓪ FROM Directory  IMPORT FileAttr, FileAttrSet, DirEntry, DirQueryProc,⓪7SetCurrentDir, GetCurrentDir, DefaultDrive,⓪7DirQuery, SetDefaultDrive, DrivesOnline,⓪7CreateDir, GetDefaultPath, SetFileAttr,⓪7ForceMediaChange, MakeFullPath, SetDefaultPath,⓪7FreeSpace;⓪ ⓪ FROM FileNames  IMPORT StrToDrive, SplitPath, SplitName, DriveToStr,⓪7NameConc, ValidatePath, ConcatPath, ConcatName,⓪7FileName, FilePath;⓪ ⓪ FROM Files      IMPORT File, Access, ReplaceMode,⓪7Create, Open, Close, State, ResetState, GetStateMsg,⓪7Remove, EOF, SetDateTime, GetDateTime;⓪ ⓪ FROM Binary     IMPORT ReadBlock, ReadBytes, WriteBlock;⓪ ⓪ IMPORT Text;⓪ ⓪ FROM GEMScan    IMPORT InputScan, CallingChain, ChainDepth;⓪ ⓪ FROM PrgCtrl    IMPORT EnvlpCarrier,⓪7SetEnvelope, TermProcess;⓪4⓪ FROM SysTypes   IMPORT ExcDesc, ExcSet, TRAP5;⓪ ⓪ FROM Excepts    IMPORT InstallPreExc;⓪ ⓪ FROM SysBuffers IMPORT ExceptsStack;⓪ ⓪ FROM EasyGEM0   IMPORT WrapAlert;⓪ ⓪ FROM UserBreak  IMPORT EnableBreak, DisableBreak;⓪ ⓪ FROM KbdEvents  IMPORT DeInstallKbdEvents, InstallKbdEvents;⓪ ⓪ FROM EasyGEM0   IMPORT SetGetMode, ShowArrow, HideMouse, ShowMouse; ⓪ ⓪ FROM AESForms   IMPORT FormError, FormAlert;⓪ ⓪ IMPORT InOutBase;⓪ ⓪ ⓪ CONST   (* Versionskennung der Shell.⓪)*)⓪(ShellRevision           = ' 2.3g ';⓪(⓪((*⓪)* Ist die folg. Konstante TRUE, wird das Modul "KbdEvents"⓪)* verwendet, das dafür sorgt, daß Tastendrücke, bei denen⓪)* Shift, Control oder Alternate gedrückt werden, immer richtig⓪)* erkannt werden.⓪)* Andernfalls kann es passieren, daß diese Umschalttasten⓪)* ignoriert werden, wenn die gewünschte Aktion erst nach⓪)* dem Tastendruck gestartet wird.⓪)* Siehe auch Hinweise im Definitions-Text des Moduls⓪)*)⓪(UseExtKeys = TRUE;⓪ ⓪((*⓪)* Ist die folg. Konstante TRUE, startet die Shell GEM-Programme⓪)* korrekt mit der AES-Funktion "ShellWrite", sofern TOS 1.4⓪)* oder höher verwendet wird. Dies kann aber zu Problemen führen,⓪)* beispielsweise, wenn die Shell von NEODESK gestartet wird,⓪)* weshalb sie dazu auf FALSE gesetzt werden kann.⓪)*)⓪(DoShellWrite = TRUE;⓪(⓪((*⓪)* Stack-Größen für die Systemprogramme. Sie sollten vergrößert⓪)* werden, wenn bei einem der Programme ein "Stacküberlauf"⓪)* auftritt.⓪)*)⓪(CompilerStackSize = 16000;⓪(LinkerStackSize = 8000;⓪(EditorStackSize = 16000;⓪(MakeStackSize = 8000;⓪ ⓪((*⓪)* Maximale Anzahl von Suchpfaden, die in einer Batch-Datei⓪)* definiert werden können. Ist zu erhöhen, wenn bim Starten⓪)* der Shell oder eines Batches eine diesbezügliche Fehler-⓪)* meldung erscheint.⓪)*)⓪(MaxSearchPaths = 40;⓪ ⓪((*⓪)*  Name der Datei in der alle zu compilierenden Module⓪)*  vom Make abgelegt werden. Das Verzeichnis (Pfad), in dem⓪)*  diese Datei erzeugt wird, ist der "temporäre Pfad", der⓪)*  in der Shell-Parameter-Box anzugeben ist!⓪)*)⓪(MakeCompFileName        = 'MAKE.M2C';⓪ ⓪ ⓪ TYPE    actionType      = (doEdit, doComp, doLink, doExec, doScan, doCpEx,⓪;doLoad, doUnLd, doCont, doBtch, doParm, doMake,⓪;doMkEx, doDftM);⓪(MySuf           = (prg, app, tos, ttp, mos, mtp, mod, def, imp, m2p,⓪;m2b, m2m, m2d);⓪ ⓪(Str128          = ARRAY [0..127] OF CHAR;⓪ ⓪(ptrString       = POINTER TO String;⓪ ⓪(PathEntry       = POINTER TO PathStr;⓪ ⓪ VAR     lastFn, currFn,⓪(workFName, workCName       : FileStr;⓪(args                       : ARRAY[0..127] OF CHAR;⓪ ⓪(suf: ARRAY MySuf OF ARRAY [0..2] OF CHAR;⓪ ⓪ ⓪0(*  Konfigurationsvariablen  *)⓪0(*  =======================  *)⓪ ⓪(shellParm       : RECORD⓪<breakActive       : BOOLEAN;⓪<batchPath         : PathStr;⓪<parameterPath     : PathStr;⓪<sectors           : CARDINAL;⓪<tracks            : CARDINAL;⓪<sides             : CARDINAL;⓪<makeName          : String;⓪<(* TRUE: Nach TOS/TTP-Prgs auf Taste warten *)⓪<waitOnReturn      : BOOLEAN;⓪:END;⓪ ⓪(noDirChange: BOOLEAN;⓪ ⓪ ⓪ ⓪ PROCEDURE conc ( REF s1,s2: ARRAY OF CHAR ): Str128;⓪"VAR s: Str128;⓪&voidO: BOOLEAN;⓪"BEGIN⓪$Concat (s1,s2,s, voidO);⓪$RETURN s⓪"END conc;⓪ ⓪ ⓪ FORWARD action (what: actionType; workFile, tool: BOOLEAN);⓪ ⓪ FORWARD FileAlert (errNo: INTEGER);⓪ FORWARD SaveParameter;⓪ FORWARD LoadParameter (REF name: ARRAY OF CHAR; loadInBatch: BOOLEAN);⓪ FORWARD ExecuteBatch (name: ARRAY OF CHAR; load: BOOLEAN);⓪ ⓪ ⓪ MODULE ShellShell;      (* Verwaltet die GEM-Aktionen der Modula-Shell *)⓪ ⓪ ⓪ IMPORT Text, SysUtil0,⓪ ⓪0(*  resource indices  *)⓪ ⓪'Menu, Mibox, Mshell, Mdatei, Mworkfil, Mparms,⓪'Mwork, Mtools, Dinfo, Mdeditwo, Mdcompwo, Mdexecwo,⓪'Mdlinkwo, Mdscanwo, Mdeditot, Mdcompot, Mdexecot,⓪'Mdlinkot, Mdscanot, Mdfolder, Mddelete, Mdquit, Wibox, Mwnew,⓪'Mwdelete, Mwchange, Mwwork1, Mwwork2, Mwwork3, Mwwork4,⓪'Mwwork5, Mwwork6, Mwwork7, Mwwork8, Mwwork9, Mwwork0,⓪'Mpshell, Mpeditor, Mpcomp, Mplink, Mpsave, Mienv,⓪'Midocu, Mihelp, Tibox, Mtool1, Mtool2, Mtool3,⓪'Mtool4, Mtool5, Mtool6, Mtool7, Mtool8, Mtool9,⓪'Mtool10, Optbox, Oquite, Opmark, Opwidth, Oppath,⓪'Ooutput, Oargs, Olibrary, Oerror, Oname, Oquit,⓪'Ook, Shellbox, Version, Scanbox, Sok, Squit,⓪'Saddr, Snamebox, Snedit, Snok, Snwork, Snquit,⓪'Argbox, Aedit, Aok, Loptbox, Locheck1, Locheck2,⓪'Locheck3, Locheck4, Locheck5, Locheck6, Locheck7, Locheck8,⓪'Lofname1, Lofname2, Lofname3, Lofname4, Lofname5, Lofname6,⓪'Lofname7, Lofname8, Lochecks, Lostack, Lomaxmod, Look,⓪'Loquit, Loname, Lonoopt, Lonamopt, Lomiddle, Lofull,⓪'Lofastld, Lofastco, Lofastme, Losymfil, Loadbox, Lfname, Sparmbox,⓪'Spmake, Spscpath, Spbreak, Spbaname, Sppaname, Spok, Spquit,⓪'Msgbar, Mbmsg, Eparmbox, Epname, Epsearch, Epstoper,⓪'Epshtemp, Epshname, Epedtemp, Epedname, Eparg, Eparname,⓪'Eparpos, Eparerro, Epok, Epquit, Helpbox, Hpnext,⓪'Hpprev, Hpquit, Hpmsgs, Hpmsg1, Hpmsg2, Hpmsg3,⓪'Hpmsg4, Hpmsg5, Hpmsg6, Hpmsg7, Hpmsg8, Hpmsg9,⓪'Hpmsg10, Hpmsg11, Hpmsg12, Hpmsg13, Hpmsg14, Infobox,⓪'Inpath, Inmkfile, Instack, Inblock, Inall, Incode,⓪'Inlength, Realform, Ihome, Inok, Inquit, Stponrtn,⓪'Pathalt, Optalt, Memalt, Debugalt, Noldstr, Okstr,⓪'Nouldstr, Noexestr, Retstr, Edstr, Workstr, Compstr,⓪'Linkstr, Infstr, Contstr, Parmsalt, Noparalt, Nowrkalt,⓪'Exitalt, Nohlpalt, Makestr, Contmalt, Editstr, Editbstr,⓪'Npathstr, Chworkti, Neworkti, Editti, Compti, Execti,⓪'Coexti, Linkti, Scanti, Foldti, Deleti,⓪ ⓪%⓪0(*  from the library  *)⓪ ⓪'ADDRESS, BYTE, WORD,⓪'ASSEMBLER, ADR, LOAD, STORE,⓪'⓪'(*  Storage  *)⓪'ALLOCATE, DEALLOCATE, MemAvail, AllAvail,⓪ ⓪'(* RealCtrl *)⓪'AnyRealFormat, UsedFormat,⓪'⓪'(*  Strings  *)⓪'String, Relation,⓪'Concat, Insert, Split, Assign, Length, Compare, Copy, Space,⓪'Upper, Empty, EatSpaces, Append, StrEqual, PosLen, Delete, Pos,⓪'⓪'MOSConfig,⓪'DefSrcSfx, ImpSrcSfx, ModSrcSfx, StdDateMask,⓪'⓪'(*  StrConv  *)⓪'CardToStr, IntToStr, StrToCard, StrToLCard, LHexToStr,⓪ ⓪'(*  Directory  *)⓪'Directory,⓪'FileAttr, FileAttrSet, DirEntry, DirQueryProc, Drive, DriveSet,⓪'DirQuery, SplitPath, SplitName, SetFileAttr, StrToDrive, FreeSpace,⓪'DriveToStr, DefaultDrive, CreateDir, GetCurrentDir, SetDefaultDrive,⓪'SetCurrentDir, FileStr, PathStr, NameStr, DrivesOnline, ValidatePath,⓪'ForceMediaChange, MakeFullPath, ConcatPath, ConcatName, SetDefaultPath,⓪'FileName, GetDefaultPath, FilePath,⓪'⓪'(*  ShellMsg  *)⓪'ScanMode, TextName, CodeName, DefSfx, ImpSfx, ModSfx, ScanAddr,⓪'ErrListFile, LinkDesc, TemporaryPath, LLRange,⓪'SrcPaths, ShellPath, MakeFileName, DefLibName, MainOutputPath,⓪'ScanOpts, DefPaths, EditorParm, CompilerParm, LinkerParm, LinkMode,⓪'⓪'⓪'(*  Loader  *)⓪'DefaultStackSize,⓪'⓪'(*  MOSGlobals  *)⓪'fOK, fEOF, fFileNotFound,⓪'⓪'(*  Files  *)⓪'File, Access,⓪'State, Open, Close, ResetState,⓪'⓪'(*  Binary  *)⓪'ReadBlock, WriteBlock,⓪'⓪'(*  GEMScan  *)⓪'ChainDepth,⓪'⓪'(*  MOSGloabls  *)⓪'MemArea,⓪'⓪'(*  Exceptions  *)⓪'TRAP5, ExcSet, ExcDesc,⓪'ExceptsStack, InstallPreExc,⓪'⓪'(*  Paths  *)⓪'ListPos,⓪'ReplaceHome, SearchFile,⓪'HomePath, HomeSymbol,⓪'⓪'(*  PrgCtrl  *)⓪'TermProcess,⓪'⓪'(*  from the outer module  *)⓪'CompilerArgs,⓪'actionType, Str128,⓪'lastFn, currFn, MySuf, ShellRevision,⓪'action, suf, args, noDirChange, shellParm, conc,⓪'SaveParameter, LoadParameter, FileAlert, ExecuteBatch;⓪ ⓪ (*  MOS  *)⓪ ⓪ FROM MOSCtrl            IMPORT RealMode;⓪ ⓪ FROM Clock              IMPORT Date, Time;⓪ ⓪ FROM ModCtrl            IMPORT ModQuery;⓪ ⓪ FROM Lists              IMPORT List, LDir, InitList,⓪?CreateList, DeleteList, ResetList, AppendEntry,⓪?InsertEntry, NextEntry, PrevEntry, RemoveEntry,⓪?CurrentEntry, ListEmpty, ScanEntries,⓪?NoOfEntries, EndOfList;⓪ ⓪ (*  Graphics  *)⓪ ⓪ FROM GrafBase   IMPORT black, Pnt, Rect, PtrBitPattern, WritingMode,⓪7Point, Rectangle, TransRect, MinPoint, ClipRect,⓪7FrameRects;⓪5⓪ (*  General GEM  *)⓪ ⓪ FROM GEMGlobals IMPORT Root, MaxDepth, NoObject, MaxStr,⓪7PtrObjTree, GemChar, MouseButton, MButtonSet,⓪7SpecialKeySet, ObjState, OStateSet, ObjFlag,⓪7OFlagSet, ObjType, FillType, SpecialKey, PtrMaxStr,⓪7LineType;⓪ ⓪ FROM GEMEnv     IMPORT RC, GemHandle, DeviceHandle, DevParm, PtrDevParm,⓪7InitGem, ExitGem, GemActive, CurrGemHandle,⓪7SetCurrGemHandle, GemError, MouseInput, DeviceParameter;⓪ ⓪ (*  AES  *)⓪ ⓪ FROM AESForms           IMPORT FormDialMode,⓪?FormDial, FormDo, FormAlert;⓪ ⓪ FROM AESObjects         IMPORT FindObject, DrawObject;⓪ ⓪ FROM AESResources       IMPORT ResourcePart,⓪?LoadResource, FreeResource, ResourceAddr;⓪ ⓪ FROM AESWindows         IMPORT SetNewDesk;⓪ ⓪ FROM AESGraphics        IMPORT MouseForm,⓪?DragBox, MouseKeyState, GrafMouse, RubberBox;⓪ ⓪ FROM AESMenus           IMPORT MenuBar, NormalTitle, EnableItem, MenuText,⓪?CheckItem;⓪ ⓪ FROM AESEvents          IMPORT menuSelected, Event, RectEnterMode,⓪?MessageBuffer, MultiEvent, EventSet;⓪ ⓪ FROM AESMisc            IMPORT ShellGet, ShellRead;⓪ ⓪ IMPORT GEMBase;⓪ ⓪ (*  Beyond GEM  *)⓪ ⓪ FROM ObjHandler         IMPORT SetPtrChoice,⓪?SetCurrObjTree, CurrObjTree,⓪?ObjectState, SetObjSpace, ObjectSpace,⓪?ObjectFlags, BorderThickness, AssignTextStrings,⓪?GetTextStrings, ObjTreeError, LinkTextString,⓪?SetObjFlags, CreateSpecification, ObjectType,⓪?SetObjType, SetIconForm, GetIconForm,⓪?SetIconLook, GetIconLook, GetComplexColor,⓪?SetComplexColor, GetIconColor, SetIconColor,⓪?SetObjState, GetObjRelatives, RightSister;⓪ ⓪ FROM EventHandler       IMPORT EventProc, WatchDogCarrier,⓪?HandleEvents, ShareTime, DeInstallWatchDog,⓪?InstallWatchDog, FlushEvents;⓪ ⓪ FROM EasyGEM0           IMPORT SetGetMode, ObjEnumRef,⓪?ShowArrow, HideMouse, ShowMouse,⓪?ObjectSpaceWithAttrs, AbsObjectSpace,⓪?GetTextString, SetTextString, SetObjStateElem,⓪?ToggleObjState, ObjectStateElem, SetObjFlag,⓪?PrepareBox, ReleaseBox, DoSimpleBox,⓪?ForceDeskRedraw, DrawObjInWdw, DeskSize,⓪?DeselectButton, ToggleCheckBox, ToggleCheckPlus,⓪?SetGetBoxLCard, SetGetBoxStr, SetGetBoxEnum,⓪?SetGetBoxState, SetGetBoxCard, CharSize,⓪?ToggleSelectBox, ObjectFlag, TreeAddress,⓪?TextStringAddress;⓪ ⓪ FROM EasyGEM1           IMPORT SelectFile;⓪ ⓪ ⓪ EXPORT TellMode, MaxTool, ToolField, NoPathsStr, EditBatStr,⓪'NoLoadStr, OkStr, NoUnloadStr, NoExecStr, RetStr, EdStr, MakeStr,⓪'WorkStr, CompStr, LinkStr, InfStr, ContMakeAlt, noParmAlt, ContStr,⓪'InitSS, ExitSS, ShowSS, HideSS, TalkWithUser, RequestArg, ScanBox,⓪'TellLoading, ClearDeskAndShowMsg, ShowBee, appl_init, appl_exit,⓪'maxWorkFiles, WorkField, IsSourceName, InitWorkFieldMenuIndizies,⓪'memErrorAlt, ShellName, LastCodeName, LastCodeSize, EditStr,⓪'IsMBTFile, multiGEM, multiTOS;⓪'⓪ ⓪ CONST   minNecessaryMem = 50L * 1024L;  (*  min. 50k Speicher  *)⓪ ⓪(screenColumns   = 80;           (*  screen width in chars  *)⓪ ⓪(MaxTool         = 10;⓪(maxWorkFiles    = 10;⓪ ⓪(resourceFile    = 'MM2TINYS.RSC';⓪(batchFile       = 'MM2TINYS.M2B';⓪(parameterFile   = 'MM2TINYS.M2P';⓪(helpFile        = 'MM2TINYS.HLP';⓪(fileBoxLength   = 41;           (*  Länge des file box edit strings  *)⓪(maxDftPathInfo  = 43;           (*  'infoBox.Inpath' length *)⓪(maxCodeFileInfo = 43;           (*  'infoBox.Incode' length  *)⓪(maxDefLibName   = 33;           (*  'infoBox.Inmkfile' length *)⓪ ⓪(msgStrLen       = 70;⓪(⓪(noRscAlt1       = '[3][Das Resource File kann|nicht geladen werden!]';⓪(noRscAlt2       = '[ Bye Bye... ]';⓪(⓪(noGemAlt1       = '[3][Anmeldung beim GEM|ist nicht gelungen!]';⓪(noGemAlt2       = '[ Pech ?! ]';⓪(⓪(memErrorAlt     = 'Fehler in Speicherverwaltung|Neustart empfohlen!';⓪(⓪(stdProtWidth    = 80;  (* Standardbreite des Compilerprotokolls *)⓪(⓪(undoKey         = BYTE (97);⓪(⓪((*  'actManager' needs these constants, that are normally defined within⓪)*  the resource in the large shell.⓪)*)⓪(Edit            = 0;⓪(Compile         = 1;⓪(Execute         = 2;⓪(Link            = 3;⓪(Scan            = 4;⓪(Resident        = 5;⓪(⓪(⓪ TYPE    ptrRectangle    = POINTER TO Rectangle;⓪(ptrList         = POINTER TO List;⓪(ptrString       = POINTER TO String;⓪(⓪ ⓪ CONST   noCurrentWorkfile       = -1;   (*  more info at 'WorkField'  *)⓪(⓪ VAR⓪0(*  globale handles  *)⓪ ⓪(dev                     : DeviceHandle;⓪(gemHdl                  : GemHandle;⓪(multiGEM                : BOOLEAN;⓪(multiTOS                : BOOLEAN;⓪(menu, desk, scanBox,⓪(shellBox, optBox,⓪(fileInfoBox, fileBox,⓪(shellParmBox, editorParmBox,⓪(sNameBox, argBox,⓪(linkBox, loadBox,⓪(fNameBox, formatBox,⓪(msgBar, confirmBox,⓪(helpBox, infoBox        : PtrObjTree;⓪(⓪(aesPB                   : GEMBase.AESPB;⓪(vdiPB                   : GEMBase.VDIPB;⓪(⓪(pathToLongAlt,⓪(cOptToLongAlt, wrgIcon2Alt,⓪(memFullAlt, drvSpaceMsg,⓪(debugAlt, ⓪(NoLoadStr, OkStr, NoPathsStr,⓪(NoUnloadStr, NoExecStr,⓪(RetStr, EdStr, WorkStr,⓪(CompStr, LinkStr, InfStr,⓪(ContMakeAlt, ContStr, EditStr, EditBatStr,⓪(parmSaveAlt, noParmAlt,⓪(noNewWorkAlt, loadFailedAlt,⓪(exitShellAlt, noHelpAlt,⓪(MakeStr, changeWorkTitle,⓪(newWorkTitle, editTitle,⓪(compileTitle, executeTitle,⓪(compExecTitle, linkTitle,⓪(scanTitle, folderTitle,⓪(deleteTitle  : PtrMaxStr;⓪(⓪(linkBoxIdx  : ARRAY[1..8] OF RECORD⓪8check,⓪8path        : CARDINAL;⓪6END;⓪(⓪(ToolField   : ARRAY[1..MaxTool] OF RECORD⓪8index       : CARDINAL; (*  Menu-Obj.  *)⓪8⓪8CASE used :BOOLEAN OF⓪:TRUE : name : FileStr;⓪8END;⓪6END;⓪ ⓪((*  Contains all work files.⓪)*)⓪(WorkField   : RECORD⓪8noUsed           : CARDINAL;⓪8current          : INTEGER;⓪8elems            : ARRAY[0..maxWorkFiles - 1] OF RECORD⓪Mindex       : CARDINAL;⓪Mused        : BOOLEAN;⓪McodeName    : FileStr;⓪MsourceName  : FileStr;⓪KEND;⓪8baseHeightOfWibox: INTEGER;⓪6END;⓪(⓪(msgStr                  : String;⓪ ⓪ ⓪0(* Variablen, die die aktuellen Shellparameter speichern *)⓪ ⓪(quitStatus              : (noQuit, quit, quickQuit);⓪(LastCodeName            : FileStr;⓪(LastCodeSize            : LONGCARD;⓪(⓪0(* Globale Infovariablen *)⓪(⓪(deskSize                : Rectangle;⓪(charWidth, charHeight   : CARDINAL;⓪(⓪(tellSpace               : Rectangle;    (*  Darf nur von 'TellLoading'⓪Q*  benutzt werden.⓪Q*)⓪ ⓪(lastArgs: ARRAY [0..127] OF CHAR;⓪ ⓪(ShellName: PathStr;⓪ ⓪0(* Globale Kurzzeitvariablen *)⓪(⓪(ok      : BOOLEAN;      (*  Siehe auch 'notOKAlert'  *)⓪(but     : CARDINAL;⓪(⓪0(*  global dummies  *)⓪(⓪(voidC    : CARDINAL;⓪(voidO    : BOOLEAN;⓪(voidCh   : CHAR;⓪(voidI    : INTEGER;⓪(void128  : ARRAY [0..127] OF CHAR;⓪(voidADR  : ADDRESS;⓪(voidFrame: Rectangle;⓪ ⓪ ⓪8(*  Diverse Hilfsroutinen  *)⓪8(*  =====================  *)⓪ ⓪((*  mouse  *)⓪(⓪ PROCEDURE mouseImage;⓪ ⓪"(*$L-*)⓪"BEGIN⓪$ASSEMBLER⓪*DC.W    $0, $0, $1, $0, $1⓪*DC.W    $07F0,$07F0,$07F0,$07F0,$0FF8,$1FFC,$3FFE,$3FFF⓪*DC.W    $3FFF,$3FFF,$1FFF,$0FFF,$0FFF,$07FF,$03FF,$03FE⓪*DC.W    $0000,$03E0,$03E0,$02A0,$07F0,$0E38,$1F7C,$1FFD⓪*DC.W    $1FFC,$1FFD,$0FF8,$07F2,$07FD,$03E0,$01CA,$01E8⓪$END;⓪"END mouseImage;⓪"(*$L=*)⓪ ⓪ PROCEDURE ShowBee;⓪ ⓪"BEGIN⓪$GrafMouse (userCursor, ADDRESS (mouseImage))⓪"END ShowBee;⓪ ⓪ ⓪ PROCEDURE appl_init;⓪"BEGIN⓪$WITH aesPB DO⓪&WITH pcontrl^ DO⓪(opcode:= 10;⓪(sintin:=  0;⓪(sintout:= 1;⓪(sadrin:=  0;⓪(sadrout:= 0;⓪&END;⓪$END;⓪$GEMBase.CallAES( ADR( aesPB));⓪"END appl_init;⓪ ⓪ PROCEDURE appl_exit;⓪"BEGIN⓪$WITH aesPB DO⓪&WITH pcontrl^ DO⓪(opcode:= 19;⓪(sintin:=  0;⓪(sintout:= 1;⓪(sadrin:=  0;⓪(sadrout:= 0;⓪&END;⓪$END;⓪$GEMBase.CallAES( ADR( aesPB));⓪"END appl_exit;⓪ ⓪ ⓪((*  strings  *)⓪ ⓪ (*  appendSpcTo -- Fügt Spaces an 'str' an, bis 'Length (str) = i'⓪!*)⓪(⓪ PROCEDURE appendSpcTo (i: CARDINAL; VAR str: ARRAY OF CHAR);⓪ ⓪"VAR   l       : CARDINAL;⓪"⓪"BEGIN⓪$l := HIGH (str);⓪$IF i < l THEN l := i END;⓪$Append (Space (l - Length (str)), str, voidO);⓪"END appendSpcTo;⓪ ⓪ (*  truncCopyStr -- 'source' wird nach 'dest' kopiert. Es gibt 'maxDestLen'⓪!*                  die Größe von 'dest' an, ist 'source' größer, so wird⓪!*                  der vordere Teil abgeschnitten und ein '..' vorange-⓪!*                  stellt.⓪!*)⓪!⓪ PROCEDURE truncCopyString (    source    : ARRAY OF CHAR;⓪?maxDestLen: CARDINAL;⓪;VAR dest      : ARRAY OF CHAR);⓪ ⓪"VAR   sourceLen: CARDINAL;⓪ ⓪"BEGIN⓪$sourceLen := Length (source);⓪$IF sourceLen > maxDestLen⓪$THEN⓪&Copy (source, sourceLen - maxDestLen - 2, sourceLen, dest, voidO);⓪&Insert ('..', 0, dest, voidO);⓪$ELSE Assign (source, dest, voidO) END;⓪"END truncCopyString;⓪&⓪&⓪((*  lists  *)⓪ ⓪ (*  deleteSimpleList -- Deletes the list 'l' completly. The elements of the⓪!*                      list must be dynamical allocated variables and would⓪!*                      all be disposed.⓪!*                      If 'killCarrier = TRUE' then list-carrier would be⓪!*                      deleted.⓪!*)⓪ ⓪ PROCEDURE deleteSimpleList (VAR l: List; killCarrier: BOOLEAN);⓪ ⓪"VAR   entry: ADDRESS;⓪ ⓪"BEGIN⓪$ResetList (l);⓪$entry := PrevEntry (l);⓪$WHILE entry # NIL DO⓪&RemoveEntry (l, voidO);⓪&DEALLOCATE (entry, 0L);⓪&entry := CurrentEntry (l);⓪$END;⓪$IF killCarrier THEN DeleteList (l, voidO) END;⓪"END deleteSimpleList;⓪ ⓪"⓪((*  tests  *)⓪ ⓪ PROCEDURE withShift (VAR s: SpecialKeySet): BOOLEAN;⓪ ⓪"BEGIN⓪$RETURN (leftShiftKey IN s) OR (rightShiftKey IN s)⓪"END withShift;⓪ ⓪ PROCEDURE withBothShifts (VAR s: SpecialKeySet): BOOLEAN;⓪ ⓪"BEGIN⓪$RETURN (leftShiftKey IN s) AND (rightShiftKey IN s)⓪"END withBothShifts;⓪ ⓪ PROCEDURE withCtrl (VAR s: SpecialKeySet): BOOLEAN;⓪ ⓪"BEGIN⓪$RETURN controlKey IN s⓪"END withCtrl;⓪ ⓪ PROCEDURE withAlt (VAR s: SpecialKeySet): BOOLEAN;⓪ ⓪"BEGIN⓪$RETURN alternateKey IN s⓪"END withAlt;⓪ ⓪"⓪((*  procs for AES objects  *)⓪(⓪ (*  formDo -- Is same as 'FormDo', but clears the most significant bit⓪!*            of 'exit' (double click).⓪!*)⓪!⓪ PROCEDURE formDo (tree: PtrObjTree; start: CARDINAL; VAR exit: CARDINAL);⓪ ⓪"BEGIN⓪$FormDo (tree, start, exit);⓪$exit := exit MOD (MaxCard DIV 2);⓪"END formDo;⓪"⓪ PROCEDURE drawObject (tree: PtrObjTree; obj: CARDINAL);⓪ ⓪"VAR   space   : Rectangle;⓪ ⓪"BEGIN⓪$space := AbsObjectSpace (tree, obj);⓪$DrawObject (tree, Root, MaxDepth, space);⓪"END drawObject;⓪"⓪ PROCEDURE hideObj (obj: CARDINAL; hide: BOOLEAN);⓪ ⓪"BEGIN⓪$SetObjFlag (CurrObjTree (), obj, hideTreeFlg, hide);⓪"END hideObj;⓪ ⓪"⓪0(*  Operations on path/file names  *)⓪ ⓪ (*  IsSourceName -- Is TRUE, if 'path' descibes a source file else FALSE.⓪!*)⓪ ⓪ PROCEDURE IsSourceName (REF path: ARRAY OF CHAR): BOOLEAN;⓪ ⓪"VAR   name    : NameStr;⓪(prefix  : ARRAY[0..64] OF CHAR;⓪(suffix  : ARRAY[0..2] OF CHAR;⓪(sufcnt  : MySuf;⓪(isSource: BOOLEAN;⓪(⓪"BEGIN⓪$SplitPath (path, prefix, name);⓪$SplitName (name, name, suffix);⓪$isSource := ~ Empty (suffix);⓪$IF isSource THEN⓪&sufcnt:= MIN (MySuf);⓪&LOOP⓪(IF StrEqual (suffix, suf[sufcnt]) THEN isSource := FALSE; EXIT⓪(ELSIF sufcnt = MAX (MySuf) THEN EXIT⓪(ELSE INC (sufcnt) END⓪&END;⓪$END;⓪$RETURN isSource⓪"END IsSourceName;⓪ ⓪ PROCEDURE isMSPFile (REF name: ARRAY OF CHAR): BOOLEAN;⓪"VAR n: ARRAY [0..11] OF CHAR;⓪"BEGIN⓪$SplitPath (name, void128, n);⓪$SplitName (n, void128, n);⓪$RETURN StrEqual (n, suf[m2p])⓪"END isMSPFile;⓪"⓪ PROCEDURE IsMBTFile (REF name: ARRAY OF CHAR): BOOLEAN;⓪"VAR n: ARRAY [0..11] OF CHAR;⓪"BEGIN⓪$SplitPath (name, void128, n);⓪$SplitName (n, void128, n);⓪$RETURN StrEqual (n, suf[m2b])⓪"END IsMBTFile;⓪"⓪ PROCEDURE isMakeFile (REF name: ARRAY OF CHAR): BOOLEAN;⓪"VAR n: ARRAY [0..11] OF CHAR;⓪"BEGIN⓪$SplitPath (name, void128, n);⓪$SplitName (n, void128, n);⓪$RETURN StrEqual (n, suf[m2m])⓪"END isMakeFile;⓪"⓪"⓪0(*  Alerts  *)⓪0(*  ======  *)⓪ ⓪ PROCEDURE doAlert (alt: PtrMaxStr);⓪ ⓪"BEGIN⓪$FormAlert (1, alt^, voidC);⓪"END doAlert;⓪"⓪ ⓪ (*  multiStringAlert -- Setzt aus den zwei Zeichenketten eine Alarmmeldung⓪!*                      zusammen und gibt diese aus.⓪!*)⓪ ⓪ PROCEDURE multiStringAlert (REF str1, str2: ARRAY OF CHAR; VAR but: CARDINAL);⓪ ⓪"VAR     str     : ARRAY[0..255] OF CHAR;⓪"⓪"BEGIN⓪$Concat (str1, str2, str, voidO);⓪$FormAlert (1, str, but);⓪"END multiStringAlert;⓪ ⓪ (*  notOKAlert -- Falls die globale Variable 'ok = FALSE' ist, so wird der⓪!*                übergebene FileStr 'str' innerhalb einer Alert-Box ange-⓪!*                zeigt.⓪!*)⓪!⓪ PROCEDURE notOKAlert (str: PtrMaxStr);⓪ ⓪"BEGIN⓪$IF ~ ok THEN doAlert (str) END;⓪"END notOKAlert;⓪ ⓪ PROCEDURE flexAlert (default: CARDINAL; REF str1,str2:ARRAY OF CHAR; alt:PtrMaxStr;⓪5VAR but:CARDINAL);⓪5⓪"VAR     str, strx       : ARRAY[0..255] OF CHAR;⓪*i, j            : INTEGER;⓪7⓪"BEGIN⓪$i:=Pos ('&',alt^, 0);⓪$j:=Pos ('&',alt^, i + 1);⓪$Copy (alt^, 0,i, str, voidO);⓪$Append (str1, str, voidO);⓪$IF j >= 0 THEN⓪&Copy (alt^, i + 1,j - i - 1, strx, voidO);⓪&Append (strx, str, voidO);⓪&Append (str2, str, voidO);⓪&i:=j;⓪$END;⓪$Copy (alt^, i + 1,Length (alt^) - CARDINAL (i) - 1, strx, voidO);⓪$Append (strx, str, voidO);⓪$FormAlert (default,str, but);⓪"END flexAlert;⓪"⓪ PROCEDURE reportOutOfMemory;⓪ ⓪"BEGIN⓪$doAlert (memFullAlt);⓪"END reportOutOfMemory;⓪ ⓪ ⓪8(*  menu procs  *)⓪8(*  ===========  *)⓪ ⓪ PROCEDURE InitWorkFieldMenuIndizies;⓪ ⓪"BEGIN⓪$WorkField.elems[0].index := Mwwork0;⓪$WorkField.elems[1].index := Mwwork1;⓪$WorkField.elems[2].index := Mwwork2;⓪$WorkField.elems[3].index := Mwwork3;⓪$WorkField.elems[4].index := Mwwork4;⓪$WorkField.elems[5].index := Mwwork5;⓪$WorkField.elems[6].index := Mwwork6;⓪$WorkField.elems[7].index := Mwwork7;⓪$WorkField.elems[8].index := Mwwork8;⓪$WorkField.elems[9].index := Mwwork9;⓪"END InitWorkFieldMenuIndizies;⓪"⓪"⓪ (*  setTools -- Verändert den Menubaum so, daß nur noch die in 'ToolField'⓪!*              vorhandenen Menu-Tool-Einträge sichtbar sind.⓪!*)⓪ ⓪ PROCEDURE setTools;⓪ ⓪"CONST   toolNameLen = 12;⓪ ⓪"VAR   f1, f2    : Rectangle;⓪(h         : INTEGER;⓪(i         : CARDINAL;⓪(str, str2 : FileStr;⓪"⓪"BEGIN⓪"⓪$SetCurrObjTree (menu, FALSE);⓪$h := 0;⓪$FOR i := 1 TO MaxTool DO⓪&WITH ToolField[i]⓪&DO⓪(IF used THEN⓪(⓪*GetTextString (menu, index, str);⓪*SplitPath (name, void128, str2);⓪*Append (Space (toolNameLen - Length (str2)), str2, voidO);⓪*Delete (str, 2, toolNameLen, voidO);⓪*Insert (str2, 2, str, voidO);⓪*MenuText (menu, index, str);⓪*f1 := ObjectSpace (index);⓪*h := h + f1.h⓪*⓪(END;⓪(hideObj (index, NOT used);⓪&END⓪$END;⓪$IF h = 0⓪$THEN⓪&IF NOT ObjectFlag (menu, Mtools, hideTreeFlg)⓪&THEN⓪(hideObj (Mtools, TRUE);⓪(f1 := ObjectSpace (Mibox);⓪(f2 := ObjectSpace (Mtools);⓪(DEC (f1.w, f2.w);⓪(SetObjSpace (Mibox, f1);⓪&END;⓪$ELSE⓪&IF ObjectFlag (menu, Mtools, hideTreeFlg) THEN⓪(hideObj (Mtools, FALSE);⓪(f1 := ObjectSpace (Mibox);⓪(f2 := ObjectSpace (Mtools);⓪(INC (f1.w, f2.w);⓪(SetObjSpace (Mibox, f1);⓪&END;⓪&f1 := ObjectSpace (Tibox);⓪&f1.h := h;⓪&SetObjSpace (Tibox, f1);⓪$END;⓪$⓪$MenuBar (menu, TRUE);⓪$⓪"END setTools;⓪ ⓪ ⓪ (*  setWorkfiles -- Verändert den Menubaum so, daß nur noch die in 'WorkField'⓪!*                  vorhandenen Menu-Workfile-Einträge sichtbar sind.⓪!*)⓪ ⓪ PROCEDURE setWorkfiles;⓪ ⓪"CONST workNameLen = 12;⓪ ⓪"VAR   i, lastIdx: INTEGER;⓪(str, str2 : FileStr;⓪(f1, f2    : Rectangle;⓪"⓪"BEGIN⓪$SetCurrObjTree (menu, FALSE);⓪$lastIdx := 0;⓪$FOR i := 0 TO maxWorkFiles - 1 DO⓪$⓪&WITH WorkField.elems[i]⓪&DO⓪(GetTextString (menu, index, str);⓪(IF used⓪(THEN⓪*lastIdx := i;⓪*SplitPath (sourceName, void128, str2);⓪(ELSE⓪*str2 := '';⓪(END;⓪(Append (Space (workNameLen - Length (str2)), str2, voidO);⓪(Delete (str, 2, workNameLen, voidO);⓪(Insert (str2, 2, str, voidO);⓪(MenuText (menu, index, str);⓪*⓪(SetObjStateElem (menu, index, disableObj, NOT used);⓪(CheckItem (menu, index, FALSE);⓪&END⓪&⓪$END;(*FOR*)⓪$⓪$(*  Cause the work file number zero is the last in the pull down menu.⓪%*)⓪$IF WorkField.elems[0].used THEN lastIdx := 10 END;⓪$⓪$(*  Hide all work file menu entries after the last used one.⓪%*)⓪$FOR i := 1 TO maxWorkFiles - 1⓪$DO⓪&hideObj (WorkField.elems[i].index, i > lastIdx);⓪$END;⓪$hideObj (WorkField.elems[0].index, 10 > lastIdx);⓪$⓪$(*  Adjust size of the ibox, that contains the pull down menu.⓪%*)⓪$f1 := ObjectSpace (Wibox);⓪$f2 := ObjectSpace (Mwwork0);⓪$f1.h := lastIdx * f2.h + WorkField.baseHeightOfWibox;⓪$SetObjSpace (Wibox, f1);⓪$⓪$IF WorkField.current # noCurrentWorkfile⓪$THEN⓪&CheckItem (menu, WorkField.elems[WorkField.current].index, TRUE);⓪$END;⓪"END setWorkfiles;⓪ ⓪ ⓪ PROCEDURE animateMenuTitle (title: CARDINAL; VAR space: Rectangle);⓪ ⓪"BEGIN⓪$NormalTitle (menu, title, FALSE);⓪$space := AbsObjectSpace (menu, title);⓪"END animateMenuTitle;⓪ ⓪ PROCEDURE deAnimateMenuTitle (title: CARDINAL);⓪ ⓪"BEGIN⓪$NormalTitle (menu, title, TRUE);⓪"END deAnimateMenuTitle;⓪"⓪ ⓪0(*  Routinen für das Dialogbox-Managment  *)⓪0(*  ====================================  *)⓪ ⓪((*  misc. box primitives  *)⓪ ⓪ TYPE    arrayOfTwoCards = ARRAY[1..2] OF CARDINAL;⓪ ⓪ PROCEDURE twoCardsInArray (c1, c2: CARDINAL): arrayOfTwoCards;⓪ ⓪"VAR   res: arrayOfTwoCards;⓪"⓪"BEGIN⓪$res[1] := c1;⓪$res[2] := c2;⓪$RETURN res⓪"END twoCardsInArray;⓪"⓪ ⓪((*  box handlers  *)⓪"⓪ PROCEDURE doCompilerOptionBox;⓪ ⓪"PROCEDURE setGetCompOpts (mode: SetGetMode);⓪"⓪$VAR notProtocol,⓪(found      : BOOLEAN;⓪(fname      : FileStr;⓪"⓪$BEGIN⓪&WITH CompilerParm DO⓪(SetGetBoxStr (optBox, Oname, mode, name);⓪(Upper (name);⓪(SetGetBoxState (optBox, Oquite, mode, checkObj, shortMsgs);⓪(SetGetBoxState (optBox, Opmark, mode, checkObj, protocol);⓪(IF mode = setValue THEN⓪*notProtocol := ~ protocol;⓪*SetGetBoxState (optBox, Oppath, setValue, disableObj, notProtocol);⓪*SetGetBoxState (optBox, Opwidth, setValue, disableObj, notProtocol);⓪(END;⓪(SetGetBoxStr (optBox, Oargs, mode, CompilerArgs);⓪(SetGetBoxStr (optBox, Oppath, mode, protName);⓪(SetGetBoxCard (optBox, Opwidth, mode, protWidth);⓪(IF protWidth < 10 THEN protWidth := stdProtWidth END;⓪(⓪(SetGetBoxStr (optBox, Ooutput, mode, MainOutputPath);⓪(ValidatePath (MainOutputPath);⓪(SetGetBoxStr (optBox, Olibrary, mode, DefLibName);⓪(IF mode = getValue THEN⓪*Upper (DefLibName);⓪*IF Length (FilePath (DefLibName)) = 0 THEN⓪,SearchFile (DefLibName, DefPaths, fromStart, found, DefLibName);⓪*END⓪(END;⓪(SetGetBoxStr (optBox, Oerror, mode, ErrListFile);⓪(Upper (ErrListFile);⓪&END;⓪$END setGetCompOpts;⓪$⓪ ⓪"VAR   space, start    : Rectangle;⓪(exit            : CARDINAL;⓪"⓪"BEGIN⓪$animateMenuTitle (Mparms, start);⓪$⓪$setGetCompOpts (setValue);⓪$PrepareBox (optBox, start, space);⓪$⓪$LOOP⓪&formDo (optBox, Ooutput, exit);⓪&⓪&CASE exit OF⓪(Ook, Oquit: DeselectButton (optBox, exit); EXIT|⓪(Oquite    : ToggleCheckBox (optBox, Oquite)|⓪(Opmark    : ToggleCheckPlus (optBox, Opmark,⓪EtwoCardsInArray (Oppath, Opwidth))|⓪&ELSE⓪&END;⓪$END;⓪$⓪$IF exit = Ook THEN setGetCompOpts (getValue) END;⓪$⓪$ReleaseBox(optBox, start, space);⓪$deAnimateMenuTitle (Mparms);⓪"END doCompilerOptionBox;⓪ ⓪ PROCEDURE doLinkerOptionBox;⓪ ⓪"PROCEDURE setGetLinkOpts (mode: SetGetMode);⓪ ⓪$VAR i       : CARDINAL;⓪(valid,⓪(notValid: BOOLEAN;⓪(refs    : ARRAY [1..4] OF ObjEnumRef;⓪$⓪$BEGIN⓪&SetGetBoxStr (linkBox, Loname, mode, LinkerParm.name);⓪&Upper (LinkerParm.name);⓪&FOR i:= 1 TO 8 DO⓪(WITH linkBoxIdx[i] DO⓪*SetGetBoxState (linkBox, check, mode, checkObj, LinkerParm.linkList[i].valid);⓪*IF mode = setValue THEN⓪,notValid := ~ LinkerParm.linkList[i].valid;⓪,SetGetBoxState (linkBox, path, setValue, disableObj, notValid);⓪*END;⓪*SetGetBoxStr (linkBox, path, mode, LinkerParm.linkList[i].name);⓪(END⓪&END;⓪&valid := (LinkerParm.linkStackSize # 0L); notValid := ~ valid;⓪&SetGetBoxState (linkBox, Lochecks, mode, checkObj, valid);⓪&IF mode = setValue THEN⓪(SetGetBoxState (linkBox, Lostack, setValue, disableObj, notValid);⓪&END;⓪&SetGetBoxLCard (linkBox, Lostack, mode, LinkerParm.linkStackSize);⓪&IF ~ valid THEN LinkerParm.linkStackSize := 0L END;⓪&SetGetBoxCard (linkBox, Lomaxmod, mode, LinkerParm.maxLinkMod);⓪&⓪&SetGetBoxState (linkBox, Lofastld, mode, checkObj, LinkerParm.fastLoad);⓪&SetGetBoxState (linkBox, Lofastco, mode, checkObj, LinkerParm.fastCode);⓪&SetGetBoxState (linkBox, Lofastme, mode, checkObj, LinkerParm.fastMemory);⓪&⓪&SetGetBoxState (linkBox, Losymfil, mode, checkObj, LinkerParm.symbolFile);⓪&⓪&refs[1].obj := Lonoopt;⓪&refs[1].value := WORD (noOptimize);⓪&refs[2].obj := Lonamopt;⓪&refs[2].value := WORD (nameOptimize);⓪&refs[3].obj := Lomiddle;⓪&refs[3].value := WORD (partOptimize);⓪&refs[4].obj := Lofull;⓪&refs[4].value := WORD (fullOptimize);⓪&i := ORD (LinkerParm.optimize);⓪&SetGetBoxEnum (linkBox, refs, mode, i);⓪&LinkerParm.optimize := VAL (LinkMode, i);⓪$END setGetLinkOpts;⓪$⓪ ⓪"VAR   space, start    : Rectangle;⓪(exit, i         : CARDINAL;⓪"⓪"BEGIN⓪$animateMenuTitle (Mparms, start);⓪$⓪$setGetLinkOpts (setValue);⓪$PrepareBox (linkBox, start, space);⓪$⓪$LOOP⓪&formDo (linkBox, Root, exit);⓪&⓪&IF (exit = Look) OR (exit = Loquit) THEN⓪(DeselectButton (linkBox, exit); EXIT⓪&ELSIF exit = Lochecks THEN⓪(ToggleCheckPlus (linkBox, Lochecks, Lostack)⓪&ELSIF (exit = Lofastld) OR (exit = Lofastco) OR (exit = Lofastme)⓪&OR (exit = Losymfil) THEN⓪(ToggleCheckBox (linkBox, exit)⓪&ELSE⓪(FOR i := 1 TO 8 DO⓪*IF linkBoxIdx[i].check = exit THEN⓪,ToggleCheckPlus (linkBox, exit, linkBoxIdx[i].path)⓪*END⓪(END;⓪&END;⓪$END;⓪$⓪$IF exit = Look THEN setGetLinkOpts (getValue) END;⓪"⓪$ReleaseBox(linkBox, start,space);⓪$deAnimateMenuTitle (Mparms);⓪"END doLinkerOptionBox;⓪"⓪ PROCEDURE doScanBox (): BOOLEAN;⓪ ⓪"VAR     but : CARDINAL;⓪"⓪"BEGIN⓪$ScanAddr := 0L;⓪$SetTextString (scanBox, Saddr, '');⓪$DoSimpleBox (scanBox, Rect (-1, -1, -1, -1), but);⓪$IF but = Sok THEN SetGetBoxLCard (scanBox, Saddr, getValue, ScanAddr) END;⓪$RETURN ScanAddr # 0L⓪"END doScanBox;⓪ ⓪ FORWARD setWorkfileName (idx: CARDINAL; VAR name: ARRAY OF CHAR);⓪ ⓪ (*  doChangeWork -- Inquires a file name from the user, that becomes the new⓪!*                  work file number 'idx'.⓪!*                  'idx' has to be an active work file.⓪!*)⓪ ⓪ PROCEDURE doChangeWork (idx: INTEGER);⓪ ⓪"VAR     str   : FileStr;⓪*ok    : BOOLEAN;⓪"⓪"BEGIN⓪$animateMenuTitle (Mworkfil, voidFrame);⓪"⓪$str := WorkField.elems[idx].sourceName;⓪$SelectFile (changeWorkTitle^, str, ok);⓪$⓪$IF ok⓪$THEN⓪&Upper (str);⓪&setWorkfileName (idx, str);⓪$END;⓪$⓪$deAnimateMenuTitle (Mworkfil);⓪"END doChangeWork;⓪ ⓪ PROCEDURE doShellParameterBox;⓪ ⓪"PROCEDURE setGetShellParm (mode: SetGetMode);⓪"⓪$BEGIN⓪&WITH shellParm DO⓪(SetGetBoxState (shellParmBox, Spbreak, mode, checkObj, breakActive);⓪(SetGetBoxStr (shellParmBox, Spbaname, mode, batchPath);⓪(Upper (batchPath);⓪(SetGetBoxStr (shellParmBox, Sppaname, mode, parameterPath);⓪(Upper (parameterPath);⓪(SetGetBoxStr (shellParmBox, Spscpath, mode, TemporaryPath);⓪(ValidatePath (TemporaryPath);⓪(IF TemporaryPath[0] # HomeSymbol THEN⓪*MakeFullPath (TemporaryPath, voidI);⓪(END;⓪(SetGetBoxStr (shellParmBox, Spmake, mode, makeName);⓪(Upper (makeName);⓪&END;⓪$END setGetShellParm;⓪$⓪"VAR   space, start    : Rectangle;⓪(exit            : CARDINAL;⓪"⓪"BEGIN⓪$animateMenuTitle (Mparms, start);⓪$⓪$setGetShellParm (setValue);⓪$PrepareBox (shellParmBox, start, space);⓪$⓪$LOOP⓪&formDo (shellParmBox, Root, exit);⓪&⓪&CASE exit OF⓪(Spok, Spquit: DeselectButton (shellParmBox, exit); EXIT|⓪(⓪(Spbreak     : ToggleCheckBox (shellParmBox, exit)|⓪&ELSE⓪&END;⓪$END;⓪$⓪$IF exit = Spok THEN setGetShellParm (getValue) END;⓪$⓪$ReleaseBox(shellParmBox, start, space);⓪$deAnimateMenuTitle (Mparms);⓪"END doShellParameterBox;⓪ ⓪ PROCEDURE doEditorParameterBox;⓪ ⓪"PROCEDURE setGetEditorParm (mode: SetGetMode);⓪"⓪$VAR disable: BOOLEAN;⓪"⓪$BEGIN⓪&WITH EditorParm DO⓪(SetGetBoxStr (editorParmBox, Epname, mode, name);⓪(Upper (name);⓪(SetGetBoxState (editorParmBox, Epsearch, mode,⓪8checkObj, searchSources);⓪(SetGetBoxState (editorParmBox, Epstoper, mode,⓪8checkObj, waitOnError);⓪(SetGetBoxState (editorParmBox, Epshtemp, mode,⓪8checkObj, tempShellFile);⓪(disable := ~ tempShellFile;⓪(SetGetBoxState (editorParmBox, Epshname, mode, disableObj, disable);⓪(SetGetBoxStr (editorParmBox, Epshname, mode, tempShellName);⓪(⓪(SetGetBoxState (editorParmBox, Epedtemp, mode,⓪8checkObj, tempEditorFile);⓪(disable := ~ tempEditorFile;⓪(SetGetBoxState (editorParmBox, Epedname, mode, disableObj, disable);⓪(SetGetBoxStr (editorParmBox, Epedname, mode, tempEditorName);⓪ ⓪(SetGetBoxState (editorParmBox, Eparg, mode,⓪8checkObj, passArgument);⓪(SetGetBoxState (editorParmBox, Eparname, mode,⓪8checkObj, passName);⓪(SetGetBoxState (editorParmBox, Eparerro, mode,⓪8checkObj, passErrorText);⓪(SetGetBoxState (editorParmBox, Eparpos, mode,⓪8checkObj, passErrorPos);⓪&END;⓪$END setGetEditorParm;⓪$⓪"VAR   start, space: Rectangle;⓪(exit        : CARDINAL;⓪ ⓪"BEGIN⓪$animateMenuTitle (Mparms, start);⓪$⓪$setGetEditorParm (setValue);⓪$PrepareBox (editorParmBox, start, space);⓪$⓪$LOOP⓪&formDo (editorParmBox, Root, exit);⓪&⓪&CASE exit OF⓪(Epok, Epquit: DeselectButton (editorParmBox, exit); EXIT|⓪(⓪(Epsearch,⓪(Epstoper,⓪(Eparg,⓪(Eparname,⓪(Eparerro,⓪(Eparpos     : ToggleCheckBox (editorParmBox, exit)|⓪(Epshtemp    : ToggleCheckPlus (editorParmBox, Epshtemp, Epshname)|⓪(Epedtemp    : ToggleCheckPlus (editorParmBox, Epedtemp, Epedname)|⓪&ELSE⓪&END;⓪$END;⓪$⓪$IF exit = Epok THEN setGetEditorParm (getValue) END;⓪"⓪$ReleaseBox(editorParmBox, start, space);⓪$deAnimateMenuTitle (Mparms);⓪"END doEditorParameterBox;⓪"⓪ PROCEDURE doHelpBox (REF fname: ARRAY OF CHAR);⓪ ⓪"CONST noLines = 14;   (*  Anzahl der Zeilen in der Hilfe-Box  *)⓪(noRows  = 65;⓪ ⓪"VAR   start, space    : Rectangle;⓪(but, i,⓪(visibleLines    : CARDINAL;⓪(text            : List;⓪(err, end, first : BOOLEAN;⓪(f               : File;⓪(str             : ptrString;⓪(path            : PathStr;⓪ ⓪"PROCEDURE fileErr (): BOOLEAN;⓪$VAR state: INTEGER;⓪$BEGIN⓪&state := State (f);⓪&IF (state < fOK) OR (state = fEOF) THEN⓪)ResetState (f);⓪)FileAlert (state);⓪)RETURN TRUE⓪&ELSE⓪)RETURN FALSE⓪&END;⓪$END fileErr;⓪$⓪"PROCEDURE addLine (obj: CARDINAL);⓪$BEGIN⓪&IF NOT end THEN⓪(str := NextEntry (text);⓪(IF str = NIL THEN end := TRUE ELSE INC (visibleLines) END;⓪&END;⓪&IF end THEN⓪(SetTextString (helpBox, obj, '')⓪&ELSE⓪(IF Length (str^) > noRows THEN⓪*Delete (str^, noRows, Length (str^) - noRows, voidO);⓪(END;⓪(SetTextString (helpBox, obj, str^);⓪&END;⓪$END addLine;⓪$⓪"BEGIN⓪$animateMenuTitle (Mparms, start);⓪$⓪$(*  Lies Hilfe-Datei ein.⓪%*)⓪ ⓪$Concat (ShellPath, fname, path, voidO);⓪$CreateList (text, err);⓪$IF err THEN reportOutOfMemory; deAnimateMenuTitle (Mparms); RETURN END;⓪$ShowBee;⓪$Open (f, path, readSeqTxt);⓪$IF (State (f)) # fOK⓪$THEN⓪&doAlert (noHelpAlt); ⓪&DeleteList (text, voidO);⓪&deAnimateMenuTitle (Mparms);⓪&ShowArrow;⓪&RETURN⓪$END;⓪$LOOP⓪$⓪&NEW (str);⓪&IF str = NIL THEN reportOutOfMemory; EXIT END;⓪&IF fileErr () THEN DISPOSE (str); EXIT END;⓪&Text.ReadString (f, str^);⓪$  AppendEntry (text, str, err);⓪&IF err THEN reportOutOfMemory; DISPOSE (str); EXIT END;⓪&IF fileErr () THEN EXIT END;⓪&Text.ReadLn (f);⓪$⓪$END;⓪$Close (f);⓪$ShowArrow;⓪$⓪$(*  Zeige Hilfe-Datei an.⓪%*)⓪%⓪$ResetList (text);⓪$but := Hpnext; visibleLines := 0; first := TRUE;⓪$REPEAT⓪$⓪&IF but = Hpprev THEN⓪(IF EndOfList (text) THEN INC (visibleLines) END;⓪(FOR i := 1 TO noLines + visibleLines DO voidADR := PrevEntry (text) END;⓪&END;⓪&SetObjStateElem (helpBox, Hpprev, disableObj, EndOfList (text));⓪&end := FALSE; visibleLines := 0;⓪&addLine (Hpmsg1); addLine (Hpmsg2); addLine (Hpmsg3);⓪&addLine (Hpmsg4); addLine (Hpmsg5); addLine (Hpmsg6);⓪&addLine (Hpmsg7); addLine (Hpmsg8); addLine (Hpmsg9);⓪&addLine (Hpmsg10); addLine (Hpmsg11); addLine (Hpmsg12);⓪&addLine (Hpmsg13); addLine (Hpmsg14);⓪&SetObjStateElem (helpBox, Hpnext, disableObj, EndOfList (text));⓪&SetObjFlag (helpBox, Hpnext, defaultFlg, NOT EndOfList (text));⓪&SetObjFlag (helpBox, Hpquit, defaultFlg, EndOfList (text));⓪&⓪&IF first THEN PrepareBox (helpBox, start, space); first := FALSE⓪&ELSE DrawObject (helpBox, Root, MaxDepth, space) END;⓪&formDo (helpBox, Root, but);⓪&DeselectButton (helpBox, but);⓪&⓪$UNTIL but = Hpquit;⓪$ReleaseBox (helpBox, start, space);⓪$⓪$(*  Lösche Hilfe-Datei.⓪%*)⓪$deleteSimpleList (text, TRUE);⓪$⓪$deAnimateMenuTitle (Mparms);⓪"END doHelpBox;⓪ ⓪ ⓪ PROCEDURE doInfoBox;⓪ ⓪ (*⓪!* Umgebungsinformationen⓪!*)⓪ ⓪"VAR   dftPath,⓪(codeFile        : FileStr;⓪(dftPathEditable : BOOLEAN;⓪(⓪"PROCEDURE setGetInfo (mode: SetGetMode);⓪"⓪$VAR lc: LONGCARD; s: ARRAY [0..13] OF CHAR;⓪"⓪$BEGIN⓪&SetObjFlag (infoBox, Inpath, editFlg, dftPathEditable);⓪&SetGetBoxStr (infoBox, Inpath, mode, dftPath);⓪&SetGetBoxLCard (infoBox, Instack, mode, DefaultStackSize);⓪&SetGetBoxStr (infoBox, Inmkfile, mode, MakeFileName);⓪&SetGetBoxState (infoBox, Stponrtn, mode, checkObj, shellParm.waitOnReturn);⓪&Upper (MakeFileName);⓪&IF mode = setValue THEN⓪(lc := MemAvail ();⓪(SetGetBoxLCard (infoBox, Inblock, setValue, lc);⓪(lc := AllAvail ();⓪(SetGetBoxLCard (infoBox, Inall, setValue, lc);⓪(SetGetBoxStr (infoBox, Ihome, setValue, HomePath);⓪(SetGetBoxStr (infoBox, Incode, setValue, codeFile);⓪(SetGetBoxLCard (infoBox, Inlength, setValue, LastCodeSize);⓪(IF UsedFormat = IEEEReal THEN⓪*IF RealMode = 2 THEN⓪,s:= 'IEEE (ST-FPU)'⓪*ELSE⓪,s:= 'IEEE (TT-FPU)'⓪*END⓪(ELSE⓪*s:= 'Megamax'⓪(END;⓪(SetGetBoxStr (infoBox, Realform, setValue, s);⓪&END;⓪$END setGetInfo;⓪$⓪"VAR   space, start   : Rectangle;⓪(exit     : CARDINAL;⓪(res     : INTEGER;⓪ ⓪"BEGIN⓪$animateMenuTitle (Mparms, start);⓪$⓪$GetDefaultPath (dftPath);⓪$dftPathEditable := (maxDftPathInfo >= Length (dftPath));⓪$truncCopyString (dftPath, maxDftPathInfo, dftPath);⓪$truncCopyString (LastCodeName, maxCodeFileInfo, codeFile);⓪$setGetInfo (setValue);⓪$⓪$PrepareBox (infoBox, start, space);⓪$LOOP⓪&formDo (infoBox, Root, exit);⓪&CASE exit OF⓪(Inok, Inquit: DeselectButton (infoBox, exit); EXIT|⓪(Stponrtn    : ToggleCheckBox (infoBox, exit)|⓪&ELSE⓪&END;⓪$END;⓪$ReleaseBox(infoBox, start, space);⓪$⓪$IF exit = Inok THEN⓪&setGetInfo (getValue);⓪&IF dftPathEditable THEN⓪(ValidatePath (dftPath);⓪(ReplaceHome (dftPath);⓪(SetDefaultPath (dftPath, res);⓪(FileAlert (res);⓪&END;⓪$END;⓪$deAnimateMenuTitle (Mparms);⓪"END doInfoBox;⓪"⓪ ⓪0(*  Exportierte Box-Funktionen  *)⓪ ⓪ PROCEDURE ScanBox (VAR name: ARRAY OF CHAR): BOOLEAN;⓪ ⓪"VAR   but: CARDINAL;⓪ ⓪"BEGIN⓪$SetTextString (sNameBox, Snedit, name);⓪$DoSimpleBox (sNameBox, Rect (-1, -1, -1, -1), but);⓪$CASE but OF⓪&Snok  : GetTextString(sNameBox, Snedit, name); Upper (name)|⓪&Snwork: WITH WorkField DO⓪0IF current >= 0⓪0THEN Assign(elems[current].sourceName, name, voidO)⓪0ELSE Assign ('', name, voidO); END;⓪.END|⓪$ELSE⓪$END;⓪$RETURN but # Snquit⓪"END ScanBox;⓪ ⓪ PROCEDURE RequestArg (VAR name: ARRAY OF CHAR);⓪ ⓪"BEGIN⓪$SetTextString (argBox, Aedit, name);⓪$DoSimpleBox (argBox, Rect (0, 0, 50, 30), voidC);⓪$GetTextString (argBox, Aedit, name);⓪"END RequestArg;⓪ ⓪ TYPE    TellMode        = (initTell, newTellValue, endTell);⓪ ⓪ PROCEDURE TellLoading (mode: TellMode; REF fname: ARRAY OF CHAR);⓪ ⓪"VAR     start   : Rectangle;⓪"⓪"BEGIN⓪$start := Rect (0, 0, 50, 30);⓪$⓪$CASE mode OF⓪&initTell            : SetTextString (loadBox, Lfname, '');⓪<PrepareBox (loadBox, start, tellSpace);⓪<ShowBee|⓪<⓪&newTellValue        : SetTextString (loadBox, Lfname, '            ');⓪<drawObject (loadBox, Lfname);⓪<SetTextString (loadBox, Lfname, FileName (fname));⓪<drawObject (loadBox, Lfname)|⓪<⓪&endTell             : ReleaseBox (loadBox, start, tellSpace);⓪<ShowArrow|⓪$END;⓪"END TellLoading;⓪ ⓪"⓪ ⓪8(*  misc. II  *)⓪8(*  ========  *)⓪ ⓪ PROCEDURE enableAndDisableMenuItems;⓪ ⓪"VAR   workSelected: BOOLEAN;⓪ ⓪"BEGIN⓪$EnableItem (menu, Mwnew, WorkField.noUsed < maxWorkFiles);⓪$workSelected := (WorkField.current # noCurrentWorkfile);⓪$EnableItem (menu, Mwdelete, workSelected);⓪$EnableItem (menu, Mwchange, workSelected);⓪$EnableItem (menu, Mdeditwo, workSelected);⓪$EnableItem (menu, Mdcompwo, workSelected);⓪$EnableItem (menu, Mdexecwo, workSelected);⓪$EnableItem (menu, Mdlinkwo, workSelected);⓪$EnableItem (menu, Mdscanwo, workSelected);⓪"END enableAndDisableMenuItems;⓪ ⓪ ⓪0(*  Arbeitende Routinen  *)⓪0(*  ===================  *)⓪ ⓪ FORWARD HideSS (complete: BOOLEAN);⓪ FORWARD ShowSS (isCompleteHidden: BOOLEAN);⓪ ⓪ ⓪ (*  setWorkfileName -- Assigns the specified workfile a new name.⓪!*)⓪ ⓪ PROCEDURE setWorkfileName (idx: CARDINAL; VAR name: ARRAY OF CHAR);⓪ ⓪"BEGIN⓪$Upper (name);⓪$WITH WorkField.elems[idx]⓪$DO⓪&Assign (name, sourceName, voidO);⓪&codeName := '';⓪$END;⓪$⓪$setWorkfiles;⓪"END setWorkfileName;⓪"⓪"⓪ (*  selectWorkfile -- Selects another work file object. Only used slots would⓪!*                    be selected.⓪!*)⓪!⓪ PROCEDURE selectWorkfile (i: INTEGER);⓪ ⓪"BEGIN⓪$WITH WorkField DO⓪$⓪&(*  Remove check mark at old curr. work file.⓪'*)⓪&IF WorkField.current # noCurrentWorkfile⓪&THEN⓪(CheckItem (menu, elems[current].index, FALSE);⓪&END;⓪&⓪&(*  Set new work file, if it is used.⓪'*)⓪&IF ~ WorkField.elems[i].used THEN i := noCurrentWorkfile END;⓪&WorkField.current := i;⓪&⓪&(*  Set check mark at new curr. work file.⓪'*)⓪&IF WorkField.current # noCurrentWorkfile⓪&THEN⓪(CheckItem (menu, elems[current].index, TRUE);⓪&END;⓪$⓪$END;(*WITH*)⓪"END selectWorkfile;⓪ ⓪ (*  makeNewWorkfile -- Tries to make another work file object.⓪!*)⓪!⓪ PROCEDURE makeNewWorkfile;⓪ ⓪"VAR   i    : CARDINAL;⓪(str  : FileStr;⓪(ok   : BOOLEAN;⓪(⓪"BEGIN⓪$animateMenuTitle (Mworkfil, voidFrame);⓪$⓪$(*  find free slot.⓪%*)⓪$(* wir wollen mit Nr. 1 anfangen, erst nach Nr. 9 soll Nr. 0 kommen *)⓪$i := 1;⓪$WHILE (i <= maxWorkFiles) AND WorkField.elems[i MOD 10].used DO INC (i) END;⓪$IF i = 10 THEN i:= 0 END;⓪$⓪$IF i < maxWorkFiles THEN    (*  if found, then init. slot  *)⓪$⓪&str := '';⓪&SelectFile (newWorkTitle^, str, ok);⓪&⓪&IF ok THEN⓪&⓪(SearchFile (str, SrcPaths, fromStart, voidO, str);⓪(INC (WorkField.noUsed);⓪(WorkField.elems[i].used := TRUE;⓪(setWorkfileName (i, str);⓪(selectWorkfile (i);⓪(⓪&END;⓪&⓪$ELSE⓪&doAlert (noNewWorkAlt)⓪$END;⓪$⓪$deAnimateMenuTitle (Mworkfil);⓪"END makeNewWorkfile;⓪ ⓪ (*  killWorkfile -- Releases the current workfile object.⓪!*)⓪ ⓪ PROCEDURE killWorkfile;⓪ ⓪"BEGIN⓪$animateMenuTitle (Mworkfil, voidFrame);⓪$⓪$WITH WorkField DO⓪&IF current # noCurrentWorkfile THEN⓪&⓪(DEC (noUsed);⓪(elems[current].used := FALSE;⓪(elems[current].sourceName := '';⓪(current := noCurrentWorkfile;⓪(setWorkfiles;                   (*  Correct menu tree  *)⓪(⓪&END;⓪$END;⓪&⓪$deAnimateMenuTitle (Mworkfil);⓪"END killWorkfile;⓪#⓪ PROCEDURE saveParameter;⓪ ⓪"VAR   but: CARDINAL;⓪ ⓪"BEGIN⓪$FormAlert (1, parmSaveAlt^, but);⓪$IF but = 1 THEN SaveParameter END;⓪"END saveParameter;⓪ ⓪ (*  actManager -- Prepares the shell to execute a shell action and then calls⓪!*                the 'action' procedure in the outer module.⓪!*⓪!*                'obj'       -- Desktop object associated with the desired⓪!*                               action.⓪!*                'specials'  -- Special keys pressed at action selection time.⓪!*                'work'      -- Parameter of the action is a work file?⓪!*                'tool'      -- Is a executed file a tool? (to set the correct⓪!*                               path in 'call')⓪!*                'alsoExec'  -- Also excecute code after compilation?⓪!*                'noSelect'  -- Don't call file slector box.⓪!*)⓪"⓪ PROCEDURE actManager (obj     : CARDINAL;⓪6specials: SpecialKeySet;⓪5 work,⓪6tool,⓪6alsoExec,⓪6noSelect: BOOLEAN);⓪ ⓪"PROCEDURE assignMsg (VAR name: ARRAY OF CHAR);⓪"⓪$BEGIN⓪&truncCopyString (name, msgStrLen, msgStr);⓪$END assignMsg;⓪$⓪"PROCEDURE setSourceCurrFnAndMsg;⓪"⓪$BEGIN⓪$⓪&IF ~ work AND Empty (currFn)THEN⓪(currFn := lastFn;⓪&END;⓪&⓪&IF work THEN⓪(WITH WorkField DO⓪*IF current >= 0 THEN assignMsg (elems[current].sourceName)⓪*ELSE msgStr := '' END;⓪(END;⓪&ELSE assignMsg (currFn) END;⓪&⓪$END setSourceCurrFnAndMsg;⓪$⓪"PROCEDURE setCodeCurrFnAndMsg;⓪"⓪$BEGIN⓪$⓪&IF ~ work AND Empty (currFn) THEN⓪(currFn := CodeName;⓪&END;⓪&⓪&IF work THEN⓪(WITH WorkField DO⓪*IF current # noCurrentWorkfile THEN⓪,assignMsg (elems[current].codeName)⓪*ELSE msgStr := '' END;⓪(END;⓪&ELSE assignMsg (currFn) END;⓪&⓪$END setCodeCurrFnAndMsg;⓪"⓪"TYPE  testProc        = PROCEDURE (REF (* name: *) ARRAY OF CHAR): BOOLEAN;⓪$⓪"PROCEDURE testWorkAndCurrFn ((*$Z-*)test: testProc(*$Z=*)): BOOLEAN;⓪"⓪$BEGIN⓪&WITH WorkField DO⓪(IF work AND (current = noCurrentWorkfile) THEN RETURN FALSE⓪(ELSE⓪*RETURN (work AND test (elems[current].sourceName)) OR test (currFn)⓪(END;⓪&END;⓪$END testWorkAndCurrFn;⓪"⓪"⓪"VAR ok: BOOLEAN;⓪"⓪"PROCEDURE ifNotWorkThenSelectFile (title: PtrMaxStr; source: BOOLEAN);⓪"⓪$BEGIN⓪&ok := TRUE;⓪&IF NOT work AND NOT noSelect⓪&THEN⓪(IF source THEN currFn := lastFn ELSE currFn := CodeName END;⓪(SelectFile (title^, currFn, ok);⓪&END;⓪$END ifNotWorkThenSelectFile;⓪$⓪$⓪"BEGIN⓪$CASE obj OF⓪&Compile  : IF alsoExec THEN ifNotWorkThenSelectFile (compExecTitle, TRUE);⓪1ELSE ifNotWorkThenSelectFile (compileTitle, TRUE) END;⓪1IF NOT ok THEN RETURN END;⓪1setSourceCurrFnAndMsg;⓪1IF testWorkAndCurrFn (isMakeFile) THEN⓪3IF alsoExec THEN action (doMkEx, work, tool)⓪3ELSE action (doMake, work, tool) END;⓪1ELSE⓪3IF alsoExec THEN action (doCpEx, work, tool)⓪3ELSE action (doComp, work, tool) END;⓪1END|⓪&Edit     : ifNotWorkThenSelectFile (editTitle, TRUE);⓪1IF NOT ok THEN RETURN END;⓪1setSourceCurrFnAndMsg; action (doEdit, work, tool)|⓪&Execute  : ifNotWorkThenSelectFile (executeTitle, FALSE);⓪1IF NOT ok THEN RETURN END;⓪1setCodeCurrFnAndMsg;⓪1Assign (lastFn, TextName, voidO);⓪1IF NOT work AND IsSourceName (currFn) THEN⓪3assignMsg (currFn);⓪3action (doExec, work, tool);⓪1ELSE⓪3IF testWorkAndCurrFn (IsMBTFile)    (*  exec. Batch-File  *) THEN⓪5action (doBtch, work, tool);⓪3ELSIF testWorkAndCurrFn (isMSPFile) (*  exec. Parm.-File  *) THEN⓪5action (doParm, work, tool);⓪3ELSIF testWorkAndCurrFn (isMakeFile)(*  exec. Make-File  *) THEN⓪5action (doMkEx, work, tool);⓪3ELSE                                (*  exec. norm. code  *)⓪5IF withShift (specials) THEN⓪7RequestArg (lastArgs);⓪7args := lastArgs;⓪5ELSE⓪7args := '';⓪5END;⓪5noDirChange := withAlt (specials);⓪5action (doExec, work, tool);⓪5noDirChange := FALSE;⓪3END;⓪1END;⓪1Assign (TextName, lastFn, voidO)|⓪&Link     : ifNotWorkThenSelectFile (linkTitle, FALSE);⓪1IF NOT ok THEN RETURN END;⓪1setCodeCurrFnAndMsg; action (doLink, work, tool)|⓪&⓪&Scan     : ifNotWorkThenSelectFile (scanTitle, TRUE);⓪1IF NOT ok THEN RETURN END;⓪1setSourceCurrFnAndMsg;⓪1IF (ChainDepth < 0) OR ~ withShift (specials)⓪1THEN⓪3IF doScanBox () THEN⓪5action (doScan, work, tool);⓪3END;⓪1ELSE msgStr := ''; action (doCont, TRUE, tool) END|⓪ (*⓪&Resident : setCodeCurrFnAndMsg;⓪1HideSS (FALSE);⓪1TellLoading (initTell, '');⓪1action (doLoad, FALSE, tool);⓪1TellLoading (endTell, '');⓪1ShowSS (FALSE)|⓪ *)⓪$ELSE⓪$END;⓪"END actManager;⓪9⓪ PROCEDURE executeTool (i: CARDINAL; specials: SpecialKeySet);⓪ ⓪"VAR   code: FileStr;⓪ ⓪"BEGIN⓪$IF ToolField[i].used AND NOT Empty (ToolField[i].name) THEN⓪&currFn := ToolField[i].name;⓪&code := CodeName;           (* Akt. Code-Datei retten *)⓪&actManager (Execute, specials, FALSE, TRUE, FALSE, TRUE);⓪&CodeName := code;           (* Akt. Code-Datei wiederherstellen *)⓪$END;⓪"END executeTool;⓪ ⓪ PROCEDURE editDocu (specials: SpecialKeySet);⓪ ⓪"VAR   oldText, oldLast: FileStr;⓪"⓪"BEGIN⓪$animateMenuTitle (Mparms, voidFrame);⓪$⓪$ConcatName (shellParm.parameterPath, suf[m2d], currFn);⓪$oldText := TextName;⓪$oldLast := lastFn;⓪$actManager (Edit, specials, FALSE, FALSE, FALSE, TRUE);⓪$TextName := oldText;⓪$lastFn := oldLast;⓪$⓪$deAnimateMenuTitle (Mparms);⓪"END editDocu;⓪ ⓪ PROCEDURE makeFolder;⓪ ⓪"VAR   ok     : BOOLEAN;⓪(name   : FileStr;⓪(result : INTEGER;⓪ ⓪"BEGIN⓪$name:= '';⓪$SelectFile (folderTitle^, name, ok);⓪$IF ok & NOT Empty (FileName (name)) THEN⓪&CreateDir (name, result); FileAlert (result);⓪$END;⓪"END makeFolder;⓪ ⓪ PROCEDURE deleteFile;⓪ ⓪"VAR   ok     : BOOLEAN;⓪(name   : FileStr;⓪(result : INTEGER;⓪ ⓪"BEGIN⓪$name:= '';⓪$SelectFile (deleteTitle^, name, ok);⓪$IF ok & NOT Empty (FileName (name)) THEN⓪&Directory.Delete (name, result); FileAlert (result);⓪$END;⓪"END deleteFile;⓪ ⓪ ⓪0(*  Routinen zur De-/Aktivierung der ShellShell  *)⓪0(*  ===========================================  *)⓪"⓪ PROCEDURE ClearDeskAndShowMsg;⓪ ⓪"BEGIN⓪$MenuBar (NIL, FALSE);⓪$IF NOT multiGEM & NOT multiTOS THEN⓪&(* unter MultiGEM nichts in Menüleise zeichnen *)⓪&DrawObject (msgBar, Root, MaxDepth, ObjectSpaceWithAttrs (msgBar, Root));⓪$END;⓪$FormDial (freeForm, Rect (0, 0, 0, 0), deskSize);⓪"END ClearDeskAndShowMsg;⓪ ⓪ PROCEDURE ShowSS (isCompleteHidden: BOOLEAN);⓪ ⓪"VAR   i   : INTEGER;⓪(name: NameStr;⓪ ⓪"BEGIN⓪$IF isCompleteHidden THEN⓪$⓪&SetCurrGemHandle (gemHdl, ok);⓪&IF ~ ok THEN HALT; TermProcess (-1) END;⓪&⓪&setTools;⓪&setWorkfiles;⓪&MouseInput (TRUE);⓪&⓪&ShowArrow;⓪&IF ~multiTOS THEN SetNewDesk (NIL, Root); END;⓪&MenuBar (menu, TRUE);⓪&⓪&FormDial (freeForm, Rect (0, 0, 0, 0), deskSize);⓪&⓪$END;⓪"END ShowSS;⓪"⓪ ⓪ PROCEDURE InitSS (): BOOLEAN;⓪ ⓪"VAR     mayLoad, success : BOOLEAN;⓪*devParm : PtrDevParm;⓪*space, f: Rectangle;⓪*x, w    : INTEGER;⓪*eventmsg: MessageBuffer;⓪*mouseloc: Point;⓪*buttons: MButtonSet;⓪*keystate: SpecialKeySet;⓪*key: GemChar;⓪*clicks: CARDINAL;⓪*events: EventSet;⓪ ⓪"BEGIN⓪$IF MemAvail () < minNecessaryMem THEN RETURN FALSE END;⓪$⓪$InitGem (RC,dev, success);⓪$IF ~ success THEN⓪&IF GemActive () THEN⓪(multiStringAlert (noGemAlt1,noGemAlt2, voidC);⓪&END;⓪&RETURN FALSE⓪$ELSE⓪&gemHdl:=CurrGemHandle ();⓪$END;⓪$ShellPath:= HomePath;⓪$⓪$GEMBase.GetPBs (gemHdl, vdiPB, aesPB);⓪$multiGEM:= aesPB.pglobal^.count > 1;⓪$multiTOS:= aesPB.pglobal^.count = -1;⓪$⓪$deskSize := DeskSize ();⓪$CharSize (dev, charWidth, charHeight);⓪$⓪2(*  Resource laden und Baumadressen ermitteln  *)⓪2⓪$LoadResource (resourceFile);⓪$IF GemError () THEN⓪&multiStringAlert (noRscAlt1,noRscAlt2, voidC);⓪&ExitGem (gemHdl);⓪&TermProcess (0)⓪$END;⓪$⓪$menu          := TreeAddress (Menu);⓪$msgBar        := TreeAddress (Msgbar);⓪$scanBox       := TreeAddress (Scanbox);⓪$shellBox      := TreeAddress (Shellbox);⓪$optBox        := TreeAddress (Optbox);⓪$sNameBox      := TreeAddress (Snamebox);⓪$argBox        := TreeAddress (Argbox);⓪$linkBox       := TreeAddress (Loptbox);⓪$loadBox       := TreeAddress (Loadbox);⓪$shellParmBox  := TreeAddress (Sparmbox);⓪$editorParmBox := TreeAddress (Eparmbox);⓪$helpBox       := TreeAddress (Helpbox);⓪$infoBox       := TreeAddress (Infobox);⓪$⓪$pathToLongAlt := TextStringAddress (Pathalt);⓪$cOptToLongAlt := TextStringAddress (Optalt);⓪$memFullAlt    := TextStringAddress (Memalt);⓪$debugAlt      := TextStringAddress (Debugalt);⓪$parmSaveAlt   := TextStringAddress (Parmsalt);⓪$noParmAlt     := TextStringAddress (Noparalt);⓪$ContMakeAlt   := TextStringAddress (Contmalt);⓪$noNewWorkAlt  := TextStringAddress (Nowrkalt);⓪$exitShellAlt  := TextStringAddress (Exitalt);⓪$noHelpAlt     := TextStringAddress (Nohlpalt);⓪$⓪$NoLoadStr     := TextStringAddress (Noldstr);⓪$OkStr         := TextStringAddress (Okstr);⓪$EditStr       := TextStringAddress (Editstr);⓪$EditBatStr    := TextStringAddress (Editbstr);⓪$NoPathsStr    := TextStringAddress (Npathstr);⓪$NoUnloadStr   := TextStringAddress (Nouldstr);⓪$NoExecStr     := TextStringAddress (Noexestr);⓪$RetStr        := TextStringAddress (Retstr);⓪$EdStr         := TextStringAddress (Edstr);⓪$WorkStr       := TextStringAddress (Workstr);⓪$CompStr       := TextStringAddress (Compstr);⓪$LinkStr       := TextStringAddress (Linkstr);⓪$InfStr        := TextStringAddress (Infstr);⓪$ContStr       := TextStringAddress (Contstr);⓪$MakeStr       := TextStringAddress (Makestr);⓪$⓪$changeWorkTitle := TextStringAddress (Chworkti);⓪$newWorkTitle    := TextStringAddress (Neworkti);⓪$editTitle       := TextStringAddress (Editti);⓪$compileTitle    := TextStringAddress (Compti);⓪$executeTitle    := TextStringAddress (Execti);⓪$compExecTitle   := TextStringAddress (Coexti);⓪$linkTitle       := TextStringAddress (Linkti);⓪$scanTitle       := TextStringAddress (Scanti);⓪$folderTitle     := TextStringAddress (Foldti);⓪$deleteTitle     := TextStringAddress (Deleti);⓪$⓪$⓪2(*  'msgBar'-Ausmaße der Größe⓪3*   des Ausgabegeräts anpassen⓪3*)⓪"⓪$devParm := DeviceParameter (dev);⓪$⓪$space.x := 0;⓪$space.y := 0;⓪$space.w := devParm^.rasterWidth + 1;⓪$space.h := deskSize.y-1;⓪$SetCurrObjTree (msgBar, FALSE);⓪$SetObjSpace (Root, space);⓪$SetObjSpace (Mbmsg, space);⓪$⓪$LinkTextString (Mbmsg, ADR (msgStr));⓪*⓪2(* Indizies ermitteln *)⓪2⓪$linkBoxIdx[1].check := Locheck1;⓪$linkBoxIdx[1].path  := Lofname1;⓪$linkBoxIdx[2].check := Locheck2;⓪$linkBoxIdx[2].path  := Lofname2;⓪$linkBoxIdx[3].check := Locheck3;⓪$linkBoxIdx[3].path  := Lofname3;⓪$linkBoxIdx[4].check := Locheck4;⓪$linkBoxIdx[4].path  := Lofname4;⓪$linkBoxIdx[5].check := Locheck5;⓪$linkBoxIdx[5].path  := Lofname5;⓪$linkBoxIdx[6].check := Locheck6;⓪$linkBoxIdx[6].path  := Lofname6;⓪$linkBoxIdx[7].check := Locheck7;⓪$linkBoxIdx[7].path  := Lofname7;⓪$linkBoxIdx[8].check := Locheck8;⓪$linkBoxIdx[8].path  := Lofname8;⓪$⓪$InitWorkFieldMenuIndizies;⓪$SetCurrObjTree (menu, FALSE);⓪$f := ObjectSpace (Wibox);⓪$WorkField.baseHeightOfWibox := f.h;⓪$f := ObjectSpace (Mwwork0);⓪$DEC (WorkField.baseHeightOfWibox, f.h * 10);⓪$⓪$SetTextString (shellBox, Version, ShellRevision);⓪$⓪$⓪2(*  Initalisiere 'Tools'-Indizies  *)⓪2⓪$ToolField[1].index := Mtool1;⓪$ToolField[2].index := Mtool2;⓪$ToolField[3].index := Mtool3;⓪$ToolField[4].index := Mtool4;⓪$ToolField[5].index := Mtool5;⓪$ToolField[6].index := Mtool6;⓪$ToolField[7].index := Mtool7;⓪$ToolField[8].index := Mtool8;⓪$ToolField[9].index := Mtool9;⓪$ToolField[10].index := Mtool10;⓪$⓪$TemporaryPath:= ShellPath;⓪$⓪$(*⓪%* Prüfen, ob ESC gedrückt wurde, weil dann beim Batch-Ausführen keine⓪%* Module geladen werden sollen.⓪%*)⓪$mayLoad:= TRUE;⓪$MultiEvent (EventSet {keyboard, timer}, 0, MButtonSet{}, MButtonSet{},⓪0lookForEntry, Rect (0,0,0,0), lookForEntry, Rect (0,0,0,0),⓪0eventmsg, 0, mouseloc, buttons, keystate, key, clicks, events);⓪$IF keyboard IN events THEN⓪&mayLoad:= key.ascii # 33C; (* ESC-Code *)⓪$END;⓪$LoadParameter (shellParm.parameterPath, mayLoad);⓪$⓪$ShowSS (TRUE);⓪$⓪$RETURN TRUE;⓪"END InitSS;⓪ ⓪ PROCEDURE HideSS (complete: BOOLEAN);⓪ ⓪"BEGIN⓪$IF complete THEN ClearDeskAndShowMsg END;⓪$ShowBee;⓪"END HideSS;⓪ ⓪ PROCEDURE ExitSS;⓪ ⓪"BEGIN⓪$msgStr := '';⓪$HideSS (TRUE);⓪$⓪$FreeResource;⓪$(* ExitGem (gemHdl); *)⓪"END ExitSS;⓪ ⓪*⓪0(*  Routinen zur Event-Verarbeitung  *)⓪0(*  ===============================  *)⓪ ⓪ (*  keyManager -- Bearbeitet alle keyboard events⓪!*)⓪ ⓪ (*$Z-*)⓪ PROCEDURE keyManager (VAR ch: GemChar; VAR specials: SpecialKeySet): BOOLEAN;⓪ (*$Z=*)⓪ ⓪"CONST   aCode   = BYTE (30);    (*  Buchstabentasten  *)⓪*cCode   = BYTE (46);⓪*eCode   = BYTE (18);⓪*fCode   = BYTE (33);⓪*iCode   = BYTE (23);⓪*lCode   = BYTE (38);⓪*nCode   = BYTE (49);⓪*mCode   = BYTE (50);⓪*oCode   = BYTE (24);⓪*pCode   = BYTE (25);⓪*qCode   = BYTE (16);⓪*rCode   = BYTE (19);⓪*sCode   = BYTE (31);⓪*uCode   = BYTE (22);⓪*xCode   = BYTE (45);⓪*⓪*code1A  = BYTE (2);     (*  Ziffern  *)⓪*code0A  = BYTE (11);⓪*code7N  = BYTE (103);⓪*code0N  = BYTE (112);⓪*⓪*plusCode= BYTE (27);    (*  <+>  *)⓪*⓪*clrHome = BYTE (71);    (*  <Clr>-Taste  *)⓪*delete  = BYTE (83);    (*  <Delete>-Taste  *)⓪*help    = BYTE (98);    (*  <Help>-Taste  *)⓪*escape  = BYTE (1);     (*  <Esc>-Taste  *)⓪*f1      = BYTE (59);    (*  <F1>  *)⓪*f10     = BYTE (68);    (*  <F10>  *)⓪*shiftF1 = BYTE (84);    (*  Shift + <F1>  *)⓪*shiftF10= BYTE (93);    (*  Shift + <F10>  *)⓪"⓪"VAR     buts    : MButtonSet;⓪*loc     : Point;⓪*⓪*success : BOOLEAN;⓪*msg     : String;⓪*⓪$PROCEDURE withoutCtrl () :BOOLEAN;⓪$BEGIN⓪&RETURN ~ (controlKey IN specials)⓪$END withoutCtrl;⓪"⓪"BEGIN⓪"⓪$CASE ch.scan OF⓪$⓪&(*  Commands  *)⓪&⓪&aCode    : actManager (Execute, specials, withoutCtrl (), FALSE, FALSE,⓪=FALSE)|⓪&cCode    : IF withAlt (specials) THEN doCompilerOptionBox⓪1ELSE ⓪3actManager (Compile, specials, withoutCtrl (), FALSE, FALSE,⓪?FALSE)⓪1END|⓪&eCode    : IF withAlt (specials) THEN doEditorParameterBox⓪1ELSE ⓪3actManager (Edit, specials, withoutCtrl (), FALSE, FALSE,⓪?FALSE)⓪1END|⓪&lCode    : IF withAlt (specials) THEN doLinkerOptionBox⓪1ELSE ⓪3actManager (Link, specials, withoutCtrl (), FALSE, FALSE,⓪?FALSE)⓪1END|⓪&sCode    : actManager (Scan, specials, withoutCtrl (), FALSE, FALSE,⓪=FALSE)|⓪&(*⓪&rCode    : actManager (Resident, specials, withoutCtrl (), FALSE, FALSE,⓪=FALSE)|⓪'*)⓪&plusCode : actManager (Compile, specials, withoutCtrl (), FALSE, TRUE,⓪=FALSE)|⓪&⓪&oCode    : makeFolder|⓪&⓪&pCode    : IF NOT withCtrl (specials)⓪1AND (WorkField.current # noCurrentWorkfile) THEN⓪3doChangeWork (WorkField.current);⓪1END|⓪&⓪&mCode    : Concat ('Making: ', MakeFileName, msg, voidO);⓪1truncCopyString (msg, msgStrLen, msgStr);⓪1action (doDftM, FALSE, FALSE)|⓪ ⓪&(*  Menu: Datei  *)⓪&⓪&nCode    : makeNewWorkfile|⓪&delete   : killWorkfile|⓪&qCode    : IF withCtrl (specials) THEN quitStatus := quickQuit⓪1ELSE quitStatus := quit END|⓪&⓪&(*  Menu: Parameter / Info *)⓪&⓪&xCode    : IF withCtrl (specials) THEN saveParameter⓪1ELSE doShellParameterBox END|⓪&uCode    : doInfoBox|⓪&help     : IF withShift (specials) THEN editDocu (specials)⓪1ELSE doHelpBox (helpFile) END|⓪&⓪&(*  Menu: Tools  *)⓪&⓪&f1..f10  : executeTool (ORD (ch.scan) - ORD (f1) + 1, specials)|⓪&shiftF1..shiftF10⓪/: INCL (specials, leftShiftKey);⓪1executeTool (ORD (ch.scan) - ORD (shiftF1) + 1, specials)|⓪&⓪&(*  work files  *)⓪&⓪&code1A..code0A,⓪&code7N..code0N⓪/: selectWorkfile (ORD (ch.ascii) - ORD ('0'))|⓪1⓪$ELSE RETURN TRUE END;⓪$⓪$RETURN FALSE;⓪"END keyManager;⓪ ⓪ (*  menuManager -- Bearbeitet alle message events, die durch Anklicken der⓪!*                 Menuzeile entstehen.⓪!*)⓪!⓪ (*$Z-*)⓪ PROCEDURE menuManager (title, item: CARDINAL): BOOLEAN;⓪ (*$Z=*)⓪"⓪"VAR     i       : CARDINAL;⓪*buts    : MButtonSet;⓪*specials: SpecialKeySet;⓪*loc     : Point;⓪*start   : Rectangle;⓪#⓪"BEGIN⓪$MouseKeyState (loc,buts,specials);⓪$CASE item OF⓪&⓪&(*  MShell  *)⓪%⓪&Dinfo     : animateMenuTitle (Mshell, start);⓪2DoSimpleBox (shellBox, start, voidC);⓪2deAnimateMenuTitle (Mshell)|⓪&⓪&(*  Datei  *)⓪&⓪&Mdfolder  : makeFolder|⓪&Mddelete  : deleteFile|⓪&Mdquit    : quitStatus := quit|⓪&⓪&(*  Bearbeiten  *)⓪&⓪&Mdeditwo  : actManager (Edit, specials, TRUE, FALSE, FALSE, FALSE)|⓪&Mdcompwo  : actManager (Compile, specials, TRUE, FALSE, FALSE, FALSE)|⓪&Mdexecwo  : actManager (Execute, specials, TRUE, FALSE, FALSE, FALSE)|⓪&Mdlinkwo  : actManager (Link, specials, TRUE, FALSE, FALSE, FALSE)|⓪&Mdscanwo  : actManager (Scan, specials, TRUE, FALSE, FALSE, FALSE)|⓪&Mdeditot  : actManager (Edit, specials, FALSE, FALSE, FALSE, FALSE)|⓪&Mdcompot  : actManager (Compile, specials, FALSE, FALSE, FALSE, FALSE)|⓪&Mdexecot  : actManager (Execute, specials, FALSE, FALSE, FALSE, FALSE)|⓪&Mdlinkot  : actManager (Link, specials, FALSE, FALSE, FALSE, FALSE)|⓪&Mdscanot  : actManager (Scan, specials, FALSE, FALSE, FALSE, FALSE)|⓪&⓪&(*  Arbeitsdatei  *)⓪&⓪&Mwnew     : makeNewWorkfile|⓪&Mwdelete  : killWorkfile|⓪&Mwchange  : IF WorkField.current # noCurrentWorkfile THEN⓪4doChangeWork (WorkField.current);⓪2END|⓪&Mwwork0   : selectWorkfile (0)|⓪&Mwwork1   : selectWorkfile (1)|⓪&Mwwork2   : selectWorkfile (2)|⓪&Mwwork3   : selectWorkfile (3)|⓪&Mwwork4   : selectWorkfile (4)|⓪&Mwwork5   : selectWorkfile (5)|⓪&Mwwork6   : selectWorkfile (6)|⓪&Mwwork7   : selectWorkfile (7)|⓪&Mwwork8   : selectWorkfile (8)|⓪&Mwwork9   : selectWorkfile (9)|⓪&⓪&(*  Parameter / Info *)⓪&⓪&Mpshell   : doShellParameterBox|⓪&Mpeditor  : doEditorParameterBox|⓪&Mpcomp    : doCompilerOptionBox|⓪&Mplink    : doLinkerOptionBox|⓪&Mpsave    : saveParameter|⓪&Mienv     : doInfoBox|⓪&Mihelp    : doHelpBox (helpFile)|⓪&Midocu    : editDocu (specials)|⓪&⓪$ELSE⓪&⓪&(*  Tools  *)⓪$⓪&FOR i := 1 TO MaxTool DO⓪(IF item = ToolField[i].index THEN executeTool (i, specials) END⓪&END;⓪&⓪$END;⓪$⓪$NormalTitle (menu,title, TRUE);⓪$⓪$RETURN FALSE;⓪"END menuManager;⓪ ⓪ PROCEDURE TalkWithUser;⓪ ⓪"VAR     worker  : ARRAY [1..2] OF EventProc;⓪*⓪*success : BOOLEAN;⓪*⓪*firstA3,⓪*newA3   : LONGCARD;⓪*⓪*button  : CARDINAL;⓪"⓪"BEGIN⓪$enableAndDisableMenuItems;⓪"⓪$worker[1].event := keyboard;⓪$worker[1].keyHdler := keyManager;⓪$worker[2].event := message;⓪$worker[2].msgType := menuSelected;⓪$worker[2].menuHdler := menuManager;⓪ ⓪$STORE (11, firstA3);⓪"⓪$REPEAT⓪"⓪&HandleEvents (0, MButtonSet{}, MButtonSet{},⓪4lookForEntry, Rect (0,0,0,0),⓪4lookForEntry, Rect (0,0,0,0),⓪40L,⓪4worker, 0);⓪"⓪&STORE (11, newA3);⓪&IF newA3 # firstA3 THEN⓪(LOAD (firstA3, 11);⓪(FormAlert (1, '[1][Heap fault][ OK ]', voidC);⓪&END;⓪&⓪&enableAndDisableMenuItems;⓪"⓪&currFn := '';         (* Damit 'lastFn' zum Zuge kommen kann *)⓪&⓪&(*  handle a quit shell request⓪'*)⓪&IF quitStatus = quit THEN⓪(FormAlert (1, exitShellAlt^, button);⓪(IF button = 3 THEN quitStatus := noQuit⓪(ELSIF button = 1 THEN SaveParameter END;⓪&END;⓪$⓪$UNTIL quitStatus # noQuit;⓪"END TalkWithUser;⓪ ⓪ (*$Z-*) ⓪ PROCEDURE hdlTrap5 (VAR desc: ExcDesc): BOOLEAN;⓪ (*$Z=*)⓪"BEGIN⓪$doAlert (debugAlt);   (*  Fehlermeldung  *)⓪$TermProcess (0);      (*  und ab damit  *)⓪$RETURN FALSE          (* Nur um des Compilers Willen  *)⓪"END hdlTrap5;⓪ ⓪ ⓪ VAR     i       : CARDINAL;⓪(hdl     : ADDRESS;⓪(wsp     : MemArea;⓪ ⓪ BEGIN (* ShellShell *)⓪ ⓪"(*  Vom Modula-System und der Shell benutzte Suffices:⓪#*)⓪"suf[prg] := 'PRG';⓪"suf[app] := 'APP';⓪"suf[tos] := 'TOS';⓪"suf[ttp] := 'TTP';⓪"suf[m2p] := 'M2P';⓪"suf[m2b] := 'M2B';⓪"suf[m2m] := 'M2M';⓪"suf[m2d] := 'M2D';⓪"(*⓪#* Die folgenden Endungen können verändert werden:⓪#* (Shell dann neu linken und alle Dateien mit den neuen Endungen⓪#* versehen - auch diejenigen in der Library "MM2DEF.M2L"!)⓪#*)⓪"suf[mod] := 'MOD';   (* Object-Files, GEM-Application *)⓪"suf[mos] := 'MOS';   (* Object-Files, TOS-Application *)⓪"suf[mtp] := 'MTP';   (* Object-Files, TTP-Application *)⓪"suf[imp] := 'IMP';   (* Object-Files bei Implementationsmodulen *)⓪"suf[def] := 'DEF';   (* Symbol-Files (übersetzte Definitionsmodule *)⓪"DefSrcSfx:= 'D';     (* ModRef: Definitions-Texte *)⓪"ImpSrcSfx:= 'I';     (* ModRef: Implementations-Texte *)⓪"ModSrcSfx:= 'M';     (* ModRef: Hauptmodul-Texte *)⓪ ⓪"(* Für Compiler: Suffices für erzeugte Dateien *)⓪"DefSfx:= suf[def];   (* Extension f. Symboldatei-Codes *)⓪"ImpSfx:= suf[imp];   (* Extension f. Implementations-Codes *)⓪"ModSfx:= suf[mod];   (* Extension f. Hauptmodul-Codes *)⓪ ⓪"(* Suffices für Loader (CallModule, LoadModule) *)⓪"MOSConfig.DftSfx:= suf[mod]; (* Default-Endung bei 'CallModule' *)⓪"MOSConfig.ImpSfx:= suf[imp]; (* Endung der importierten Module *)⓪ ⓪"(*  some box info vars⓪#*)⓪"LastCodeName := '';⓪"LastCodeSize := 0L;⓪ ⓪"(*  default configuration⓪#*)⓪ ⓪"MakeFileName := '';⓪ ⓪"WITH shellParm DO⓪$breakActive := TRUE;⓪$batchPath := batchFile;⓪$⓪$ShellRead (ShellName, args); (* Liest Pfad/Name der Shell und Argumentzeile *)⓪$IF args [0] # 0C THEN⓪&(* M2P-Dateiname wurde in Argumentzeile übergeben *)⓪&Assign (args, parameterPath, voidO)⓪$ELSE⓪&(* M2P-Dateiname wird aus Shell-Pfad u. "MM2SHELL.M2P" zusammengesetzt *)⓪&ConcatPath (ShellName, parameterFile, parameterPath)⓪$END;⓪$ConcatName (parameterPath, suf[m2p], parameterPath);⓪$MakeFullPath (parameterPath, voidI);⓪$⓪$waitOnReturn := FALSE;⓪"END;⓪"⓪"(*  no work file.⓪#*)⓪"FOR i := 0 TO maxWorkFiles - 1 DO WorkField.elems[i].used := FALSE END;⓪"WorkField.noUsed := 0;⓪"WorkField.current := noCurrentWorkfile;⓪"⓪"WITH EditorParm DO⓪$name:= 'GME';⓪$searchSources := FALSE;⓪$waitOnError := FALSE;⓪$tempShellFile := FALSE;⓪$tempShellName := '';⓪$tempEditorFile := FALSE;⓪$tempEditorName := '';⓪$passArgument := TRUE;⓪$passName := TRUE;⓪$passErrorText := TRUE;⓪$passErrorPos := TRUE;⓪"END;⓪"⓪"ErrListFile := 'MODULA.ERR';⓪"MainOutputPath := '';⓪"WITH CompilerParm DO          (*  Compiler-Parameter:     *)⓪$name:= 'MM2Comp';⓪$shortMsgs := FALSE;         (*  - keine Kurzausgaben    *)⓪$protocol := FALSE;          (*  - kein Protokoll        *)⓪$protWidth := stdProtWidth;⓪$protName := '';⓪"END;⓪"⓪"WITH LinkerParm DO⓪$name := 'MM2Link';⓪$FOR i := MIN (LLRange) TO MAX (LLRange) DO⓪&linkList[i].valid := FALSE;⓪&linkList[i].name := '';⓪$END;⓪$optimize := fullOptimize; (*  - Vollständige Optimierung  *)⓪$linkStackSize := 0;⓪$maxLinkMod := 100;⓪$fastLoad := TRUE;⓪$fastCode := TRUE;⓪$fastMemory:= TRUE;⓪$symbolFile:= FALSE;⓪$symbolArgs:= '';  (* optional: Argumente f. 'MM2LnkIO.OutputSymbols' *)⓪$outputName:= '';  (* optional: Name d. Ausgabedatei *)⓪"END;⓪"⓪"FOR i := 1 TO MaxTool DO ToolField[i].used := FALSE END;  (*  Keine Tools  *)⓪"⓪"msgStr := '';⓪"⓪"(* TRAP #5 belegen, um Fehlermeldung auszugeben, wenn in einem Modul $D+⓪#* verwendet wird, ohne 'Debug'-Modul importiert zu haben *)⓪"wsp.bottom := ADR (ExceptsStack);⓪"wsp.length := SIZE (ExceptsStack);⓪"InstallPreExc (ExcSet{TRAP5}, hdlTrap5, TRUE, wsp, hdl);⓪ ⓪"quitStatus := noQuit;⓪ ⓪ END ShellShell;⓪ ⓪ ⓪((***************************)⓪((* Hier endet 'ShellShell' *)⓪((***************************)⓪ ⓪ ⓪ CONST   mspFileMagic    = 10071898L + 02700000000L;    (*  ab 20: TinyShell  *)⓪(escKey          = 33C;⓪ ⓪ TYPE    PtrStr = POINTER TO String;⓪(AutoCmd = (noCmd, scan, edit, compile, execute, comp_exec, exec_src,⓪3make_exec, dftMake, dftMake_exec, contMake);⓪ ⓪ VAR  ready    : BOOLEAN;⓪%dummy    : INTEGER;⓪%handle   : INTEGER;⓪%strVal   : BOOLEAN;⓪%buttonNum: CARDINAL;⓪%editorsMakeCmd,⓪%autoCmd    : AutoCmd;⓪%shellStart,⓪%makeActive : BOOLEAN;⓪%callRes    : LoaderResults;⓪%callMsg    : String;⓪%exitCode   : INTEGER;⓪%voidO      : BOOLEAN;⓪%voidI      : INTEGER;⓪%voidC      : CARDINAL;⓪ ⓪%withPost1, withPost2: BOOLEAN;⓪%postAmble1, postAmble2, postArgs1, postArgs2: String;⓪ ⓪ ⓪ PROCEDURE FileAlert (errNo: INTEGER);⓪ ⓪"VAR     msg     : ARRAY[0..50] OF CHAR;⓪ ⓪"BEGIN⓪$IF (errNo < fOK) AND (errNo # fDriveNotReady) AND (errNo # fWriteProtected)⓪$THEN⓪&GetStateMsg (errNo, msg);⓪&Concat ('[1][', msg, msg, voidO);⓪&Append ('][  OK  ]', msg, voidO);⓪&FormAlert (1, msg, voidC);⓪$END;⓪"END FileAlert;⓪ ⓪ PROCEDURE SaveParameter;⓪ ⓪"VAR   f      : File;⓪"⓪"PROCEDURE ioErr (): BOOLEAN;⓪"⓪$VAR ioRes: INTEGER;⓪"⓪$BEGIN⓪&ioRes := State (f);⓪&IF ioRes < fOK THEN⓪(ResetState (f);⓪(FileAlert (ioRes);⓪(Remove (f);⓪(ShowArrow;⓪&END;⓪&RETURN ioRes < fOK⓪$END ioErr;⓪$⓪"PROCEDURE wBlock (VAR data: ARRAY OF BYTE): BOOLEAN;⓪"⓪$BEGIN⓪&WriteBlock (f, data);⓪&RETURN ~ ioErr ()⓪$END wBlock;⓪"⓪"VAR   magic: LONGCARD;⓪(ok: BOOLEAN;⓪"BEGIN⓪$ShowBee;⓪$⓪$Create (f, HomeReplaced (shellParm.parameterPath), writeOnly, replaceOld);⓪$IF State (f) # fOK THEN FileAlert (State (f)); RETURN END;⓪$⓪$magic := mspFileMagic;⓪$LOOP (* Ist keine echte Schleife - lediglich f. einfacheres EXIT *)⓪&ok:= FALSE;⓪&IF ~ wBlock (magic) THEN EXIT END;⓪&IF ~ wBlock (shellParm) THEN EXIT END;⓪&IF ~ wBlock (WorkField) THEN EXIT END;⓪&IF ~ wBlock (lastFn) THEN EXIT END;⓪&IF ~ wBlock (CodeName) THEN EXIT END;⓪&IF ~ wBlock (EditorParm) THEN EXIT END;⓪&IF ~ wBlock (CompilerParm) THEN EXIT END;⓪&IF ~ wBlock (LinkerParm) THEN EXIT END;⓪&IF ~ wBlock (DefaultStackSize) THEN EXIT END;⓪&IF ~ wBlock (TemporaryPath) THEN EXIT END;⓪&IF ~ wBlock (MakeFileName) THEN EXIT END;⓪&IF ~ wBlock (DefLibName) THEN EXIT END;⓪&IF ~ wBlock (ErrListFile) THEN EXIT END;⓪&IF ~ wBlock (MainOutputPath) THEN EXIT END;⓪&IF ~ wBlock (CompilerArgs) THEN EXIT END;⓪&ok:= TRUE;⓪&EXIT⓪$END;⓪$IF NOT ok THEN RETURN END;⓪$⓪$Close (f);⓪$⓪$ShowArrow;⓪"END SaveParameter;⓪ ⓪ PROCEDURE LoadParameter (REF name: ARRAY OF CHAR; loadInBatch: BOOLEAN);⓪ ⓪"VAR   f      : File;⓪(fname  : FileStr;⓪ ⓪"PROCEDURE ioErr (): BOOLEAN;⓪"⓪$VAR ioRes: INTEGER;⓪"⓪$BEGIN⓪&ioRes := State (f);⓪&IF ioRes < fOK THEN⓪(ResetState (f);⓪(FileAlert (ioRes);⓪(Close (f);⓪(ShowArrow;⓪&END;⓪&RETURN ioRes < fOK⓪$END ioErr;⓪$⓪"PROCEDURE rBlock (VAR data: ARRAY OF BYTE): BOOLEAN;⓪"⓪$BEGIN⓪&ReadBlock (f, data);⓪&RETURN ~ ioErr ()⓪$END rBlock;⓪ ⓪"VAR   magic, n: LONGCARD;⓪(ch: CHAR;⓪(ok: BOOLEAN;⓪"⓪"BEGIN⓪$ShowBee;⓪$⓪$Assign (name, fname, voidO);⓪$ReplaceHome (fname);⓪$MakeFullPath (fname, voidI);⓪$Open (f, fname, readOnly);⓪$IF State (f) # fOK THEN FormAlert (1, noParmAlt^, voidC); RETURN END;⓪$⓪$IF ~ rBlock (magic) THEN RETURN END;⓪$IF magic = mspFileMagic THEN⓪&LOOP (* Ist keine echte Schleife - lediglich f. einfacheres EXIT *)⓪(ok:= FALSE;⓪(IF ~ rBlock (shellParm) THEN EXIT END;⓪(IF ~ rBlock (WorkField) THEN EXIT END;⓪(IF ~ rBlock (lastFn) THEN EXIT END;⓪(IF ~ rBlock (CodeName) THEN EXIT END;⓪(IF ~ rBlock (EditorParm) THEN EXIT END;⓪(IF ~ rBlock (CompilerParm) THEN EXIT END;⓪(IF ~ rBlock (LinkerParm) THEN EXIT END;⓪(IF ~ rBlock (DefaultStackSize) THEN EXIT END;⓪(IF ~ rBlock (TemporaryPath) THEN EXIT END;⓪(IF ~ rBlock (MakeFileName) THEN EXIT END;⓪(IF ~ rBlock (DefLibName) THEN EXIT END;⓪(IF ~ rBlock (ErrListFile) THEN EXIT END;⓪(IF ~ rBlock (MainOutputPath) THEN EXIT END;⓪(IF ~ rBlock (CompilerArgs) THEN EXIT END;⓪(ok:= TRUE;⓪(EXIT⓪&END;⓪&IF NOT ok THEN RETURN END;⓪ ⓪&Assign (fname, shellParm.parameterPath, voidO);⓪ ⓪$ELSE⓪&FormAlert (1, noParmAlt^, voidC)⓪$END;⓪$Close (f);⓪$⓪$InitWorkFieldMenuIndizies;⓪$⓪$(*  If a batch file is specified, execute it. *)⓪$IF NOT Empty (shellParm.batchPath) THEN⓪&ExecuteBatch (shellParm.batchPath, loadInBatch)⓪$END;⓪$⓪$ShowArrow;⓪"END LoadParameter;⓪ ⓪ ⓪ PROCEDURE PrepareScan;⓪ ⓪"BEGIN⓪$ScanAddr := CallingChain [ScanIndex].relAddr;⓪$ScanOpts := CallingChain [ScanIndex].codeOpts;⓪$Assign (CallingChain [ScanIndex].sourceName, TextName, voidO);⓪"END PrepareScan;⓪ ⓪ PROCEDURE readWorkNames;⓪ ⓪"BEGIN⓪$WITH WorkField DO⓪&IF current >= 0 THEN⓪(workFName := elems[current].sourceName;⓪(workCName := elems[current].codeName;⓪&ELSE⓪(workFName := ''; workCName := '';⓪&END;⓪$END;⓪"END readWorkNames;⓪ ⓪ PROCEDURE writeWorkName (REF source, code: ARRAY OF CHAR);⓪"VAR i : INTEGER;⓪"BEGIN (* richtige Arbeitsdatei suchen und Code speichern *)⓪$WITH WorkField DO⓪&IF current >= 0 THEN⓪(FOR i:= 0 TO maxWorkFiles-1 DO⓪*IF elems[i].used & StrEqual (source, elems[i].sourceName) THEN⓪,Assign (code, elems[i].codeName, voidO);⓪,RETURN⓪*END⓪(END⓪&END;⓪$END;⓪"END writeWorkName;⓪ ⓪ PROCEDURE Bconout ( c: CHAR );⓪"(*$L-*)⓪"BEGIN⓪$ASSEMBLER⓪(SUBQ.L  #1,A3⓪(MOVEQ   #0,D0⓪(MOVE.B  -(A3),D0⓪(MOVE    D0,-(A7)⓪(MOVE    #2,-(A7)⓪(MOVE    #3,-(A7)⓪(TRAP    #13⓪(ADDQ.L  #6,A7⓪$END⓪"END Bconout;⓪"(*$L=*)⓪ ⓪ (*$Z-*)⓪ PROCEDURE Bconin (): CHAR;⓪ (*$Z=*)⓪"(*$L-*)⓪"BEGIN⓪$ASSEMBLER⓪(MOVE    #2,-(A7)⓪(MOVE    #2,-(A7)⓪(TRAP    #13⓪(ADDQ.L  #4,A7⓪(MOVE.B  D0,(A3)+⓪(CLR.B   (A3)+⓪$END⓪"END Bconin;⓪"(*$L=*)⓪ ⓪ (*$Z-*)⓪ PROCEDURE Bconstat (): BOOLEAN;⓪ (*$Z=*)⓪"(*$L-*)⓪"BEGIN⓪$ASSEMBLER⓪(MOVE    #2,-(A7)⓪(MOVE    #1,-(A7)⓪(TRAP    #13⓪(ADDQ.L  #4,A7⓪(TST     D0⓪(SNE     D0⓪(ANDI    #1,D0⓪(MOVE.W  D0,(A3)+⓪$END⓪"END Bconstat;⓪"(*$L=*)⓪ ⓪ PROCEDURE clrscr;⓪"BEGIN⓪$Bconout (33C); Bconout ('E');⓪"END clrscr;⓪ ⓪ PROCEDURE curon;⓪"BEGIN⓪$Bconout (33C); Bconout ('e');⓪"END curon;⓪ ⓪ PROCEDURE curoff;⓪"BEGIN⓪$Bconout (15C); Bconout (33C); Bconout ('f');⓪"END curoff;⓪ ⓪ PROCEDURE bing;⓪"BEGIN⓪$Bconout (7C);⓪"END bing;⓪ ⓪ ⓪ PROCEDURE alert ( REF s1,s2,s3: ARRAY OF CHAR );⓪"VAR msg: ARRAY [0..269] OF CHAR;⓪"BEGIN⓪$Assign (s1, msg, voidO);⓪$WrapAlert (msg, 0);⓪$IF s2[0] # 0C THEN⓪&Append ('|', msg, strVal);⓪&Append (s2, msg, voidO);⓪&WrapAlert (msg, 0);⓪$END;⓪$Insert ('[0][',0,msg,strVal);⓪$Append ('][]',msg,strVal);⓪$Insert (s3,CARDINAL(Length(msg)-1),msg, voidO);⓪$FormAlert (1, msg,buttonNum);⓪"END alert;⓪"⓪ PROCEDURE load;⓪ ⓪"VAR     r       : LoaderResults;⓪*msg     : ARRAY [0..79] OF CHAR;⓪*name    : FileStr;⓪"⓪"BEGIN⓪$IF Empty (currFn) THEN name := CodeName ELSE name := currFn END;⓪$TellLoading (newTellValue, name);⓪$LoadModule (name, StdPaths, name, msg, r);⓪$IF r # noError THEN alert (conc (name, NoLoadStr^), msg, OkStr^) END;⓪"END load;⓪ ⓪ PROCEDURE unload;⓪ ⓪"VAR     r       : LoaderResults;⓪*name    : FileStr;⓪"⓪"BEGIN⓪$IF Empty (currFn) THEN name := CodeName ELSE name := currFn END;⓪$UnLoadModule (name, r);⓪$IF r # noError THEN alert (conc (name, NoUnloadStr^), '', OkStr^) END;⓪"END unload;⓪ ⓪ PROCEDURE closeAllWindows;⓪"VAR w: CARDINAL;⓪"BEGIN⓪$AESWindows.UpdateWindow (TRUE);⓪$LOOP⓪&w:= AESWindows.TopWindow ();⓪&IF w = 0 THEN EXIT END;⓪&AESWindows.CloseWindow (w);⓪&AESWindows.DeleteWindow (w);⓪$END;⓪$IF (GEMEnv.GEMVersion() >= $140) THEN⓪&(* UpdateWindow(FALSE) hier unnötig - siehe ST-Magazin 3/91 Seite 92. *)⓪&AESWindows.ResetWindows ();⓪$ELSE⓪&AESWindows.UpdateWindow (FALSE);⓪$END;⓪"END closeAllWindows;⓪ ⓪ VAR callSwitchedToTextMode: BOOLEAN;⓪ ⓪ PROCEDURE call ( VAR modname: ARRAY OF CHAR; args: ARRAY OF CHAR;⓪1stackSize: LONGCARD; interactive, checkError, tool:BOOLEAN );⓪ ⓪"TYPE SufSet = SET OF MySuf;⓪"⓪"VAR sufstr            : ARRAY[0..2] OF CHAR;⓪&dummy             : ARRAY[0..12] OF CHAR;⓪&name, path,⓪&oldPath           : PathStr;⓪&getparm           : BOOLEAN;⓪&prgType           : AESMisc.ProgramType;⓪&sufcnt, suffix    : MySuf;⓪&res               : INTEGER;⓪&dummyChar         : CHAR;⓪&hdl               : ADDRESS;⓪&prevStackSize     : LONGCARD;⓪ ⓪"BEGIN⓪$Assign (modname, name, voidO);⓪$Upper (name);⓪ ⓪$SplitPath (name, path, dummy);⓪$SplitName (dummy,dummy,sufstr);⓪$suffix:= mod;⓪$IF sufstr[0] = 0C THEN⓪&ConcatName (name, suf[mod], name)⓪$ELSE⓪&FOR sufcnt:= MIN (MySuf) TO MAX (MySuf) DO⓪(IF StrEqual (sufstr,suf[sufcnt]) THEN⓪*suffix := sufcnt;⓪(END⓪&END;⓪$END;⓪$prgType:= AESMisc.graphicPrgm;⓪$getparm:= FALSE;⓪$IF suffix IN SufSet {ttp,mtp} THEN getparm:= interactive END;⓪$IF suffix IN SufSet {ttp,mtp,tos,mos} THEN prgType:= AESMisc.textPrgm END;⓪ ⓪$IF getparm THEN⓪&RequestArg (args);⓪$END;⓪ ⓪$GetDefaultPath (oldPath);⓪$IF ~noDirChange THEN⓪&IF (path[0] = 0C) AND NOT tool THEN⓪((* Ist kein Pfad angegeben, bleibt bei Tools und⓪)* Systemprgs der akt. Pfad erhalten⓪)*)⓪(SearchFile (name, StdPaths, fromStart, voidO, name);⓪(SplitPath (name, path, dummy);⓪&END;⓪&ReplaceHome (path);⓪&SetDefaultPath (path, voidI)⓪$END;⓪ ⓪$callSwitchedToTextMode := (prgType = AESMisc.textPrgm);⓪ ⓪$(*$? UseExtKeys: IF NOT tool THEN DeInstallKbdEvents END; *)⓪$⓪$IF NOT multiGEM & NOT multiTOS THEN⓪&closeAllWindows; (* alle noch offenen Fenster (von ACCs) schließen *)⓪$END;⓪ ⓪$IF prgType = AESMisc.textPrgm THEN⓪&HideMouse;⓪&clrscr;⓪&curon;⓪$END;⓪$⓪$IF DoShellWrite AND (GEMEnv.GEMVersion() >= $140) THEN⓪&IF NOT multiTOS THEN⓪(AESMisc.ShellWrite (TRUE, prgType, name, args);⓪&END⓪$END;⓪ ⓪$IF NOT multiGEM & NOT multiTOS THEN⓪&(* AC_CLOSE-Nachricht an alle Accessories schicken *)⓪&appl_exit; (* nach appl_exit kein AES-Aufruf mehr! *)⓪$END;⓪$⓪$prevStackSize:= DefaultStackSize;⓪$IF stackSize # 0 THEN DefaultStackSize:= stackSize END;⓪$CallModule (name, StdPaths, args, NIL, exitCode, callMsg, callRes);⓪$DefaultStackSize:= prevStackSize;⓪ ⓪$IF NOT multiGEM & NOT multiTOS THEN⓪&(* beim GEM wieder anmelden *)⓪&appl_init;  (* erst jetzt wieder AES-Aufrufe erlaubt! *)⓪$END;⓪(⓪$IF DoShellWrite AND (GEMEnv.GEMVersion() >= $140) THEN⓪&IF NOT multiTOS THEN⓪((* Dies alles funktioniert erst ab TOS 1.4 richtig *)⓪(AESMisc.ShellWrite (FALSE, AESMisc.graphicPrgm, ShellName, '');⓪&END⓪$END;⓪$⓪$IF prgType = AESMisc.textPrgm THEN⓪&(* Nach Programmende bei TOS-Programmen auf Tastendruck warten *)⓪&IF interactive & shellParm.waitOnReturn⓪)& NOT ScanMode & (callRes = noError) THEN⓪(WHILE Bconstat () DO dummyChar:= Bconin () END;⓪(curon;⓪(dummyChar:= Bconin ()⓪&END;⓪&curoff;⓪&ShowMouse⓪$END;⓪ ⓪$IF NOT multiGEM & NOT multiTOS THEN⓪&closeAllWindows; (* alle noch offenen Fenster (von ACCs) schließen *)⓪$END;⓪ ⓪$ClearDeskAndShowMsg;⓪$⓪$IF Inconsistent () THEN⓪&alert (memErrorAlt, '', OkStr^)⓪$END;⓪ ⓪$(*$? UseExtKeys: IF NOT tool THEN InstallKbdEvents END; *)⓪ ⓪$SetDefaultPath (oldPath, res);⓪ ⓪$IF checkError THEN⓪&IF callRes # noError THEN⓪(IF callRes = exitFault THEN⓪*alert (callMsg, '', OkStr^)⓪(ELSE⓪*alert (conc (name, NoExecStr^), callMsg, OkStr^)⓪(END⓪&ELSIF ScanMode THEN⓪(PrepareScan;⓪(IF ScanBox (TextName) THEN⓪*autoCmd := scan⓪(ELSE⓪*autoCmd := noCmd⓪(END⓪&ELSIF exitCode # 0 THEN⓪(CASE exitCode OF⓪*fFileNotFound,⓪*fPathNotFound,⓪*fInvalidDrive: FormError (2)|⓪4(* "Diese Anwendung kann Datei oder Ordner nicht finden" *)⓪*fAccessDenied: FormError (5)|⓪6(* "Datei existiert bereits oder ist Schreibgeschützt" *)⓪*fTooManyOpen,⓪*fInsufficientMemory: FormError (8)|⓪-(* "Es steht nicht genug Speicher für diese Anw. zur Verfügung" *)⓪(ELSE⓪*alert (conc (RetStr^, IntToStr (exitCode, 0)), '', OkStr^)⓪(END⓪&END⓪$END;⓪$ScanMode := FALSE⓪"END call;⓪ ⓪ ⓪ PROCEDURE callEdit (VAR s0: ARRAY OF CHAR; errMsg: BOOLEAN);⓪ ⓪"VAR s, voidStr,⓪&tempPath  : ARRAY [0..126] OF CHAR;⓪&f         : File;⓪&lastBreak : BOOLEAN;⓪&zero      : CARDINAL;⓪ ⓪"PROCEDURE writeTempFile;⓪ ⓪$PROCEDURE stateError (): BOOLEAN;⓪ ⓪&BEGIN⓪(IF State (f) # fOK THEN⓪*FileAlert (State (f));⓪*ResetState (f);⓪*Remove (f);⓪*RETURN TRUE⓪(ELSE RETURN FALSE END;⓪&END stateError;⓪$⓪$PROCEDURE writeLn (VAR str: ARRAY OF CHAR): BOOLEAN;⓪$⓪&BEGIN⓪(Text.WriteString (f, str);⓪(IF stateError () THEN RETURN FALSE END;⓪(Text.WriteLn (f);⓪(IF stateError () THEN RETURN FALSE END;⓪(RETURN TRUE⓪&END writeLn;⓪$⓪$VAR s2: Str128;⓪&⓪$BEGIN⓪&ReplaceHome (tempPath);⓪&Create (f, tempPath, writeSeqTxt, replaceOld);⓪&IF stateError () THEN RETURN END;⓪&IF ~ EditorParm.passName THEN⓪(IF ~ writeLn (TextName) THEN RETURN END;⓪&END;⓪&IF ~ EditorParm.passErrorPos AND errMsg THEN⓪(Assign (CardToStr (TextLine, 0), s2, voidO);⓪(Append (' ', s2, voidO);⓪(Append (CardToStr (TextCol - 1, 0), s2, voidO);⓪(IF ~ writeLn (s2) THEN RETURN END;⓪&END;⓪&IF ~ EditorParm.passErrorText AND errMsg THEN⓪(IF ~ writeLn (ErrorMsg) THEN RETURN END;⓪&END;⓪&Close (f);⓪$END writeTempFile;⓪ ⓪"BEGIN⓪$Split (s0, PosLen (' ', s0, 0), TextName, s, voidO);⓪$IF EditorParm.searchSources THEN⓪&SearchFile (TextName, SrcPaths, fromStart, voidO, TextName)⓪$END;⓪$IF EditorParm.passName THEN Insert (TextName, 0, s, voidO) END;⓪ ⓪$(* Zeiger auf akt. Dateinamen dem Editor mit übergeben⓪&IF isToolbox THEN⓪(Append (' ^', s, voidO);⓪(Append (CardToStr (LONGCARD (ADR (TextName)), 0), s, voidO);⓪(Append (' ', s, voidO);⓪&END;⓪$*)⓪ ⓪$IF EditorParm.tempShellFile THEN⓪&SplitPath (EditorParm.name, tempPath, voidStr);⓪&Append (EditorParm.tempShellName, tempPath, voidO);⓪&Append (tempPath, s, strVal);⓪&writeTempFile;⓪$END;⓪$⓪$IF ~ EditorParm.passArgument THEN s := '' END;⓪$⓪$lastBreak:= shellParm.breakActive;⓪$shellParm.breakActive:= FALSE;⓪$call (EditorParm.name, s, EditorStackSize, FALSE, FALSE, TRUE);⓪$shellParm.breakActive:= lastBreak;⓪$⓪$IF EditorParm.tempEditorFile THEN⓪&SplitPath (EditorParm.name, tempPath, voidStr);⓪&Append (EditorParm.tempEditorName, tempPath, voidO);⓪&ReplaceHome (tempPath);⓪&Open (f, tempPath, readSeqTxt);⓪&IF State (f) = fOK THEN⓪(Text.ReadString (f, s);⓪(Close (f);⓪(zero := 0;⓪(exitCode := StrToCard (s, zero, strVal);⓪(IF ~ strVal THEN exitCode := 0 END;⓪&ELSE⓪(exitCode:= 0⓪&END;⓪$END;⓪$⓪$autoCmd := noCmd;⓪$IF callRes # noError THEN⓪&alert (EdStr^, callMsg, OkStr^)⓪$ELSE⓪&CASE exitCode OF⓪(1: autoCmd := compile|⓪(2: autoCmd := exec_src|⓪(3: autoCmd := dftMake|⓪(4: autoCmd := dftMake_exec|⓪&ELSE⓪&END;⓪&IF (autoCmd = dftMake_exec) OR (autoCmd = dftMake) THEN⓪(IF NOT makeActive THEN⓪*editorsMakeCmd:= autoCmd;⓪*makeActive:= TRUE;⓪(END;⓪(autoCmd:= contMake⓪&ELSE⓪(IF makeActive THEN⓪*FormAlert (1, ContMakeAlt^, buttonNum);⓪*IF buttonNum = 1 THEN⓪,autoCmd:= contMake⓪*END⓪(END⓪&END⓪$END;⓪"END callEdit;⓪ ⓪ PROCEDURE hdedit (wrk: BOOLEAN);⓪ ⓪"VAR name1, name2: NameStr;⓪&dummy       : Str128;⓪"⓪"BEGIN⓪$IF wrk THEN⓪&callEdit (workFName, FALSE);⓪$ELSE⓪&callEdit (currFn, FALSE)⓪$END;⓪$Upper (TextName);⓪$SplitPath (TextName, dummy, name1);⓪$SplitPath (workFName, dummy, name2);⓪$IF NOT StrEqual (name1, name2) THEN lastFn := TextName END;⓪"END hdedit;⓪ ⓪ PROCEDURE hdrun (wrk, tool: BOOLEAN);⓪ ⓪"VAR   found,⓪(codeOK  : BOOLEAN;⓪(f       : File;⓪(cDate,⓪(sDate   : Clock.Date;⓪(cTime,⓪(sTime   : Clock.Time;⓪(sname,⓪(cname,⓪(voidStr,⓪(suffix  : FileStr;⓪ ⓪ ⓪"PROCEDURE longTime (d:Clock.Date; t:Clock.Time): LONGCARD;⓪$BEGIN⓪&RETURN LONG (Clock.PackDate (d)) * $10000 + LONG (Clock.PackTime (t))⓪$END longTime;⓪ ⓪"PROCEDURE getCodeDateTime (    suffix: MySuf;⓪Apaths : PathList;⓪=VAR cname : FileStr;⓪=VAR found : BOOLEAN);⓪$VAR testName: FileStr;⓪(testN2: FileStr;⓪(path: ptrString;⓪$BEGIN⓪&found:= FALSE;⓪ ⓪&ConcatName (cname, suf[suffix], testN2);⓪&IF NOT Empty (MainOutputPath) THEN⓪((* Eingestellten Ausgabe-Pfad prüfen *)⓪(Concat (MainOutputPath, testN2, testName, voidO);⓪&ELSE⓪((* Ausgabe-Pfad aus Compiler-Pfaden prüfen *)⓪(IF suffix = imp THEN⓪*Concat (ImpOutPath, testN2, testName, voidO);⓪(ELSE⓪*Concat (ModOutPath, testN2, testName, voidO);⓪(END⓪&END;⓪&ReplaceHome (testName);⓪&Open (f, testName, readOnly);⓪&found:= (State (f) >= fOK);⓪&IF NOT found THEN⓪((* Datei auf Default-Pfaden suchen *)⓪(SearchFile (testN2, paths, fromStart, found, testName);⓪(IF found THEN⓪*Open (f, testName, readOnly);⓪(END⓪&END;⓪&IF found THEN⓪(GetDateTime (f, cDate, cTime);⓪(Close (f);⓪(cname:= testName;⓪&END;⓪$END getCodeDateTime;⓪ ⓪"BEGIN (* hdrun *)⓪$codeOK := FALSE;⓪$(* check, wether code is valid if source is executed *)⓪$IF wrk THEN⓪&SearchFile (workFName, SrcPaths, fromStart, found, sname);⓪$ELSIF IsSourceName (currFn) THEN⓪&SearchFile (currFn, SrcPaths, fromStart, found, sname)⓪$ELSE⓪&(* wir haben einen Code -> sofort ausführen *)⓪&codeOK := TRUE⓪$END;⓪$IF NOT codeOK THEN⓪&IF found THEN⓪((* Source vorhanden *)⓪(IF wrk THEN⓪*workFName:= sname; cname:= workCName⓪(ELSE⓪*currFn:= sname; cname:= ''⓪(END;⓪(IF Empty (cname) THEN⓪*(* Wir müssen den Code suchen *)⓪*SplitPath (sname, voidStr, cname);⓪*SplitName (cname, cname, suffix);⓪*getCodeDateTime (mod, ModPaths, cname, codeOK);⓪*IF NOT codeOK THEN⓪,getCodeDateTime (mos, ModPaths, cname, codeOK) END;⓪*IF NOT codeOK THEN⓪,getCodeDateTime (mtp, ModPaths, cname, codeOK) END;⓪*IF NOT codeOK THEN⓪,getCodeDateTime (imp, ImpPaths, cname, codeOK) END;⓪(ELSE⓪*(* Code schon vorhanden *)⓪*Open (f, cname, readOnly);⓪*codeOK:= (State (f) = fOK);⓪*IF codeOK THEN⓪,GetDateTime (f, cDate, cTime);⓪,Close (f);⓪*END;⓪(END;⓪(IF codeOK THEN⓪*(* Code vorhanden -> Zeit der Source ermitteln und mit Code vergl. *)⓪*Open (f, sname, readOnly);⓪*GetDateTime (f, sDate, sTime);⓪*Close (f);⓪*codeOK:= longTime (cDate,cTime) >= longTime (sDate,sTime);⓪(END;⓪&ELSE⓪((* Source nicht vorhanden -> Fehler melden? *)⓪((* wenn nicht, wird einfach Compiler gestartet... (weil codeOK=FALSE) *)⓪&END;⓪&⓪$ELSE⓪&cname:= currFn⓪$END;⓪$⓪$IF codeOK THEN⓪&IF wrk THEN workCName := cname⓪&ELSE CodeName := cname END;⓪&call (cname, args, 0, TRUE, TRUE, tool)⓪$ELSE⓪&IF wrk THEN workCName:= '' END;⓪&TextName := sname;⓪&autoCmd := comp_exec⓪$END⓪$⓪"END hdrun;⓪ ⓪ ⓪ PROCEDURE DoEditBox (batch, mustShow: BOOLEAN; VAR cont: BOOLEAN);⓪"VAR s: String;⓪&msg: Str128;⓪&buttonNum: CARDINAL;⓪"BEGIN⓪$(* Signalton: *)⓪$bing;⓪$IF mustShow OR EditorParm.waitOnError THEN⓪&msg := '[2][][]';⓪&IF batch THEN⓪(Insert (EditBatStr^, 6, msg, voidO)⓪&ELSE⓪(Insert (EditStr^, 6, msg, voidO)⓪&END;⓪&s:= ErrorMsg;⓪&WrapAlert (s, 0);⓪&Insert (s, 4, msg, voidO);⓪&FormAlert (1, msg, buttonNum);⓪&IF buttonNum = 1 THEN⓪(autoCmd:= edit; cont:= FALSE;⓪&ELSE⓪(autoCmd:= noCmd; cont:= (buttonNum = 2);⓪&END⓪$ELSE⓪&autoCmd:= edit; cont:= FALSE;⓪$END⓪"END DoEditBox;⓪ ⓪ ⓪ (*  callComp -- Calls the compiler to compile the file 'modName'.⓪!*              'work = TRUE' means the workfile is compiled.⓪!*              'batch = TRUE' means the compiler is called while⓪!*              executing a batch file. In that case 'cont' states,⓪!*              if the execution of the batch file has to continue⓪!*              after this proc. returns.⓪!*)⓪ ⓪ PROCEDURE callComp (VAR modname: ARRAY OF CHAR;⓪8work,⓪8batch  : BOOLEAN;⓪4VAR cont   : BOOLEAN);⓪ ⓪"VAR i:INTEGER;⓪&s,msg:Str128;⓪ ⓪"BEGIN⓪$(*  String mit Compileroptionen aufbauen.⓪%*)⓪$WITH CompilerParm DO⓪&IF shortMsgs THEN s:= ' -Q' ELSE s:= ' +Q' END;⓪&Append (' ', s, voidO);⓪&Append (CompilerArgs, s, voidO);⓪&IF ~ Empty (MainOutputPath) THEN⓪(Append (' /O', s, voidO);⓪(Append (MainOutputPath, s, voidO);⓪&END;⓪&IF protocol THEN⓪(Append (' /C', s, voidO);⓪(Append (CardToStr (protWidth, 0), s, voidO);⓪(Append (' /P', s, voidO);⓪(Append (protName, s, voidO);⓪&END;⓪$END;⓪$⓪$CodeName:= '';⓪$IF autoCmd = scan THEN ScanMode:= TRUE END;⓪$call (CompilerParm.name, conc (modname, s),⓪*CompilerStackSize, FALSE, FALSE, TRUE);⓪$⓪$cont:= TRUE;⓪$IF callRes # noError THEN⓪&alert (CompStr^, callMsg, OkStr^);⓪&autoCmd:= noCmd⓪$ELSE⓪&CASE exitCode OF⓪(0:   IF autoCmd = scan THEN⓪/autoCmd:= edit⓪-ELSIF ~ batch THEN⓪-⓪/IF makeActive THEN⓪1CodeName:= LastCodeName;⓪/ELSE⓪1Upper (CodeName);⓪1LastCodeName:= CodeName;⓪1LastCodeSize:= CodeSize;⓪/END;⓪/IF work THEN⓪1workCName:= CodeName;⓪1writeWorkName (TextName, CodeName);⓪/END;⓪/IF autoCmd = comp_exec THEN⓪1autoCmd:= execute⓪/ELSE⓪1autoCmd:= noCmd⓪/END;⓪/⓪-END|⓪(2:   DoEditBox (batch, TRUE, cont)|⓪(3:   DoEditBox (batch, FALSE, cont)⓪&ELSE⓪(autoCmd:= noCmd⓪&END⓪$END⓪"END callComp;⓪ ⓪ ⓪ PROCEDURE callLink (VAR moduleName: ARRAY OF CHAR);⓪ ⓪"VAR s: ARRAY [0..124] OF CHAR;⓪"⓪"BEGIN⓪$Assign (moduleName, s, voidO);⓪$WITH LinkerParm DO⓪&IF optimize = partOptimize THEN⓪(Append (' -H', s, voidO);⓪&ELSIF optimize = nameOptimize THEN⓪(Append (' -M', s, voidO);⓪&ELSIF optimize = fullOptimize THEN⓪(Append (' -F', s, voidO);⓪&END;⓪&IF fastLoad THEN⓪(Append (' -0', s, voidO)⓪&END;⓪&IF fastCode THEN⓪(Append (' -1', s, voidO)⓪&END;⓪&IF fastMemory THEN⓪(Append (' -2', s, voidO)⓪&END;⓪&IF symbolFile THEN⓪(Append (' -S', s, voidO);⓪(Append (symbolArgs, s, voidO)⓪&END;⓪&IF outputName[0] # '' THEN⓪(Append (' -O', s, voidO);⓪(Append (outputName, s, voidO)⓪&END;⓪&call (name, s, LinkerStackSize, FALSE, FALSE, TRUE);⓪$END;⓪$IF callRes # noError THEN⓪&alert (LinkStr^, callMsg, OkStr^)⓪$END⓪"END callLink;⓪ ⓪ ⓪ PROCEDURE callMake (REF name: ARRAY OF CHAR; batch: BOOLEAN; VAR cont: BOOLEAN);⓪ ⓪"BEGIN⓪$call (shellParm.makeName, name, MakeStackSize, FALSE, FALSE, TRUE);⓪$cont:= TRUE;⓪$IF callRes # noError THEN⓪&alert (MakeStr^, callMsg, OkStr^);⓪&autoCmd:= noCmd;⓪$ELSE⓪&CASE exitCode OF⓪(0: LastCodeName:= CodeName;⓪+LastCodeSize:= 0L;⓪+ConcatPath (TemporaryPath, MakeCompFileName, TextName);⓪+ReplaceHome (TextName);⓪+IF autoCmd = make_exec THEN autoCmd:= comp_exec⓪+ELSE autoCmd:= compile END|⓪(1: IF autoCmd = make_exec THEN autoCmd:= execute⓪+ELSE autoCmd:= noCmd END|⓪(2: DoEditBox (batch, FALSE, cont)⓪&ELSE⓪(autoCmd:= noCmd;⓪&END;⓪$END⓪"END callMake;⓪ ⓪ ⓪ PROCEDURE hdscan (wrk: BOOLEAN);⓪ ⓪"BEGIN⓪$ErrorMsg:= '<Scanned>';⓪$autoCmd:= scan;⓪$IF wrk THEN callComp (workFName, TRUE, FALSE, voidO);⓪$ELSIF Empty (currFn) THEN callComp (lastFn, FALSE, FALSE, voidO)⓪$ELSE callComp (currFn, FALSE, FALSE, voidO) END;⓪"END hdscan;⓪ ⓪ PROCEDURE hdcomp (wrk: BOOLEAN);⓪ ⓪"BEGIN⓪$IF wrk THEN callComp (workFName, TRUE, FALSE, voidO);⓪$ELSE callComp (currFn, FALSE, FALSE, voidO); lastFn:= currFn; END;⓪"END hdcomp;⓪ ⓪ PROCEDURE hdlink (wrk: BOOLEAN);⓪ ⓪"BEGIN⓪$IF wrk THEN callLink (workCName)⓪$ELSE callLink (currFn) END;⓪"END hdlink;⓪"⓪ PROCEDURE hdmake (wrk: BOOLEAN);⓪ ⓪"BEGIN⓪$IF wrk THEN callMake (workFName, FALSE, voidO)⓪$ELSE callMake (currFn, FALSE, voidO) END;⓪"END hdmake;⓪ ⓪ PROCEDURE action (what: actionType; wrkFile, tool: BOOLEAN);⓪ ⓪"TYPE aTypeSet = SET OF actionType;⓪"⓪"CONST noHideAction = aTypeSet {doLoad, doUnLd, doCont};⓪"⓪"VAR s       : Str128;⓪&dummy, i: CARDINAL;⓪&n1, n2  : ARRAY [0..11] OF CHAR;⓪&hidden  : BOOLEAN;⓪ ⓪"BEGIN⓪$IF wrkFile THEN readWorkNames END;⓪$⓪$IF what IN noHideAction THEN hidden:= FALSE⓪$ELSE HideSS (TRUE); hidden:= TRUE END;⓪$⓪$editorsMakeCmd:= noCmd;⓪$makeActive:= FALSE;⓪$CASE what OF⓪&doEdit: hdedit (wrkFile)|⓪&doComp: hdcomp (wrkFile)|⓪&doExec: hdrun (wrkFile, tool);⓪.IF wrkFile THEN writeWorkName (workFName, workCName) END|⓪&doLink: hdlink (wrkFile)|⓪&doScan: hdscan (wrkFile)|⓪&doCpEx: autoCmd := comp_exec; hdcomp (wrkFile)|⓪&doLoad: load|⓪&doUnLd: unload|⓪&doCont: InputScan (ErrorMsg, ScanIndex);⓪.PrepareScan;⓪.IF ScanBox (TextName) THEN⓪0HideSS (TRUE); hidden:= TRUE;⓪0autoCmd:= scan;⓪0callComp (TextName, FALSE, FALSE, voidO)⓪.END|⓪&doBtch: IF wrkFile THEN ExecuteBatch (workFName, TRUE)⓪.ELSE ExecuteBatch (currFn, TRUE) END|⓪&doParm: IF wrkFile THEN LoadParameter (workFName, TRUE)⓪.ELSE LoadParameter (currFn, TRUE) END|⓪&doMake,⓪&doMkEx,⓪&doDftM: makeActive:= TRUE;⓪.autoCmd:= contMake⓪$ELSE⓪$END;⓪ ⓪$REPEAT⓪&CASE autoCmd OF⓪ ⓪(contMake:  CASE what OF⓪5doMake: autoCmd:= noCmd; hdmake (wrkFile)|⓪5doMkEx: autoCmd:= make_exec; hdmake (wrkFile)|⓪5doDftM: autoCmd:= dftMake⓪3ELSE⓪5autoCmd:= editorsMakeCmd⓪3END|⓪ ⓪(edit     : Concat (TextName, ' ', s, strVal);⓪3IF EditorParm.passErrorPos THEN⓪5Append (CardToStr (TextLine, 0), s, strVal);⓪5Append (' ', s, strVal);⓪5Append (CardToStr (TextCol - 1, 0), s, strVal);⓪5Append (' ', s, strVal);⓪3END;⓪3IF EditorParm.passErrorText THEN⓪5Append ('"', s, strVal);⓪5Append (ErrorMsg, s, voidO);⓪5Append ('" ', s, strVal);⓪3END;⓪3callEdit (s, TRUE)|⓪ ⓪(scan,⓪(compile,⓪(comp_exec: callComp (TextName, wrkFile, FALSE, voidO)|⓪(⓪(exec_src : autoCmd:= noCmd;⓪3workFName:= '';⓪3workCName:= '';⓪3wrkFile:= FALSE;⓪3WITH WorkField DO⓪5IF current >= 0 THEN⓪7i:= 0;⓪7LOOP (* workFile richtig bestimmen *)⓪9WITH elems[i] DO⓪;IF used & StrEqual (TextName, sourceName) THEN⓪=workFName:= sourceName;⓪=workCName:= codeName;⓪=wrkFile:= TRUE;⓪=EXIT⓪;END;⓪9END;⓪9INC (i);⓪9IF i = maxWorkFiles THEN⓪;EXIT⓪9END;⓪7END⓪5END;⓪3END;⓪3IF ~wrkFile THEN currFn:= TextName END;⓪3hdrun (wrkFile, tool);⓪3IF wrkFile THEN writeWorkName (workFName, workCName) END|⓪ ⓪(execute  : autoCmd:= noCmd;⓪3call (CodeName, args, 0, TRUE, TRUE, tool)|⓪ ⓪(dftMake_exec,⓪(dftMake  : IF autoCmd = dftMake_exec THEN autoCmd:= make_exec END;⓪3callMake ('' (* >> Make verw. Default-Namen aus ShellMsg *), FALSE, voidO)|⓪&ELSE⓪&END⓪$UNTIL autoCmd = noCmd;⓪$⓪$Assign (lastFn, TextName, voidO);⓪$⓪$IF hidden THEN ShowSS (TRUE) END;⓪"END action;⓪ ⓪ ⓪ ⓪ TYPE    pathEntry       = RECORD⓪<used: BOOLEAN;⓪<path: PathStr;⓪:END;⓪ ⓪ VAR     pathArray: ARRAY [1..MaxSearchPaths] OF pathEntry;⓪ ⓪ PROCEDURE ExecuteBatch (name: ARRAY OF CHAR; load: BOOLEAN);⓪ ⓪"VAR f                 : File;⓪&s, arg            : ARRAY[0..255] OF CHAR;⓪&gotLine, cont,⓪&doIt              : BOOLEAN;⓪&result            : INTEGER;⓪&oldDrive          : Drive;⓪&oldPath           : PathStr;⓪"⓪"PROCEDURE delSpc (VAR s:ARRAY OF CHAR);⓪$BEGIN⓪&WHILE s[0] = ' ' DO Delete (s,0,1, voidO) END⓪$END delSpc;⓪"⓪"PROCEDURE equ (a,b: ARRAY OF CHAR): BOOLEAN;⓪$BEGIN⓪&Upper (a);⓪&Upper (b);⓪&RETURN Compare (FileName (a), FileName (b)) = equal⓪$END equ;⓪ ⓪"PROCEDURE setLinkName (VAR n:ARRAY OF CHAR);⓪$VAR first: CHAR;⓪(i: CARDINAL;⓪(useEmpty: BOOLEAN;⓪$BEGIN⓪&first:=n[0];⓪&IF (first = '-') OR (first = '+') THEN⓪(Delete (n, 0, 1, voidO);⓪(delSpc (n);⓪&END;⓪&FOR useEmpty:= FALSE TO TRUE DO⓪(FOR i:= MIN (LLRange) TO  MAX (LLRange) DO⓪*IF equ (LinkerParm.linkList[i].name, n)⓪*OR (useEmpty AND Empty (LinkerParm.linkList[i].name)) THEN⓪,LinkerParm.linkList[i].valid:= (first # '-');⓪,Assign (n, LinkerParm.linkList[i].name, voidO);⓪,RETURN⓪*END⓪(END⓪&END⓪$END setLinkName;⓪"⓪"PROCEDURE setToolName (VAR n:ARRAY OF CHAR);⓪$VAR i: CARDINAL;⓪$BEGIN⓪&FOR i:=1 TO MaxTool DO⓪(IF ~ToolField[i].used THEN⓪*ToolField[i].used:= TRUE;⓪*Assign (n,ToolField[i].name, voidO);⓪*RETURN⓪(END⓪&END⓪$END setToolName;⓪"⓪"PROCEDURE getFirstPath (paths: PathList; VAR path: ARRAY OF CHAR);⓪$VAR entry: PathEntry;⓪$BEGIN⓪&Lists.ResetList (paths);⓪&entry:= Lists.NextEntry (paths);⓪&IF entry # NIL THEN⓪(Assign (entry^, path, voidO)⓪&ELSE⓪(path[0]:= ''⓪&END⓪$END getFirstPath;⓪"⓪"PROCEDURE killPaths (VAR paths: PathList);⓪"⓪$VAR entry: ADDRESS;⓪(idx  : CARDINAL;⓪"⓪$BEGIN⓪&Lists.ResetList (paths);⓪&entry:= Lists.PrevEntry (paths);⓪&WHILE entry # NIL DO⓪(idx:= 1;⓪(WHILE (idx <= MaxSearchPaths)⓪.AND (ADR (pathArray[idx].path) # entry) DO INC (idx) END;⓪(IF idx <= MaxSearchPaths THEN pathArray[idx].used:= FALSE END;⓪(Lists.RemoveEntry (paths, voidO);⓪(entry:= Lists.CurrentEntry (paths);⓪&END;⓪$END killPaths;⓪"⓪"PROCEDURE setP ( VAR paths: PathList );⓪$VAR err:BOOLEAN; c:CHAR; idx: CARDINAL;⓪$BEGIN⓪&killPaths (paths);⓪&idx:= 1;⓪&LOOP⓪(IF EOF (f) THEN EXIT END;⓪(Text.ReadString (f,s);⓪(IF s[0] # ' ' THEN EXIT END;⓪(WHILE (idx <= MaxSearchPaths) AND pathArray[idx].used DO INC (idx) END;⓪(IF idx <= MaxSearchPaths THEN⓪*EatSpaces (s);⓪*IF Compare ('.',s) = equal THEN s:= '' END;⓪*ValidatePath (s);⓪*Assign (s,pathArray[idx].path,err);⓪*Lists.AppendEntry (paths,ADR(pathArray[idx].path),err);⓪*pathArray[idx].used:= TRUE;⓪*INC (idx)⓪(ELSE⓪*alert (NoPathsStr^, '', OkStr^)⓪(END⓪&END;⓪&gotLine:= TRUE;⓪$END setP;⓪"⓪"PROCEDURE is (REF s0:ARRAY OF CHAR): BOOLEAN;⓪$BEGIN⓪&RETURN StrEqual (s0,s)⓪$END is;⓪ ⓪"PROCEDURE prep (REF in: ARRAY OF CHAR): BOOLEAN;⓪$BEGIN⓪&Split (in,PosLen (' ',in,0),s,arg,strVal);⓪&delSpc (arg);⓪&Upper (s);⓪&RETURN (s[0] # 0C) AND (s[0] # '*')⓪$END prep;⓪ ⓪"PROCEDURE getLC (VAR l: LONGCARD);⓪$VAR i: CARDINAL;⓪$BEGIN⓪&i:= 0;⓪&l:= StrToLCard (arg, i, strVal);⓪$END getLC;⓪ ⓪"VAR found, tell: BOOLEAN;⓪&i: CARDINAL;⓪&res : INTEGER;⓪ ⓪"PROCEDURE unTell;⓪$BEGIN⓪&IF tell THEN TellLoading (endTell, ''); tell := FALSE END;⓪$END unTell;⓪ ⓪"BEGIN⓪$ShowBee;⓪$tell:= FALSE;⓪$SearchFile (name, StdPaths, fromStart, found, name);⓪$Open (f, name, readSeqTxt);⓪$IF State (f) < 0 THEN⓪&GetStateMsg (State(f), s);⓪&alert (InfStr^, s, OkStr^);⓪$ELSE⓪&gotLine:= FALSE;⓪&cont:= TRUE;⓪&REPEAT⓪ ⓪(IF NOT gotLine THEN Text.ReadString (f, s) END;⓪(gotLine:= FALSE;⓪(⓪(doIt:= FALSE;⓪(IF prep (s) THEN⓪*IF is ('IF_SHELLSTART') THEN    (*  IF-Clause  *)⓪,IF shellStart THEN⓪.doIt:= prep (arg);⓪,END;⓪*ELSIF is ('IF_EXITCODE') THEN⓪,i:= 0;⓪,IF StrToInt (arg, i, voidO) = exitCode THEN⓪.Copy (arg, i, 200, arg, voidO);⓪.doIt:= prep (arg);⓪,END⓪*ELSE⓪,doIt:= TRUE⓪*END;⓪(END;⓪ ⓪(IF doIt THEN⓪H(*  misc  *)⓪*IF is ('WAIT') THEN⓪,alert (arg,'',ContStr^);⓪*ELSIF is ('STACKSIZE') THEN⓪,getLC (DefaultStackSize);⓪,IF DefaultStackSize < 1024L THEN DefaultStackSize:= 1024 END;⓪ ⓪H(*  tools  *)⓪*ELSIF is ('DELETETOOLS') THEN⓪,FOR i:= 1 TO MaxTool DO ToolField[i].used:= FALSE END;  (*  Keine Tools  *)⓪*ELSIF is ('TOOL') THEN⓪,setToolName (arg)⓪H(*  loader commands  *)⓪*ELSIF is ('EXEC') THEN⓪,Split (arg, PosLen (' ', arg, 0), arg, s, strVal);⓪,delSpc (s);⓪,unTell;⓪,Upper (arg);⓪,IF IsMBTFile (arg) THEN⓪.ExecuteBatch (arg, load)⓪,ELSE⓪.call (arg, s, 0, FALSE, TRUE, FALSE);⓪,END;⓪,IF autoCmd # noCmd THEN cont := FALSE END;⓪*ELSIF is ('POSTAMBLE1') THEN⓪,Split (arg,PosLen (' ',arg,0),postAmble1,postArgs1,strVal);⓪,delSpc (postArgs1);⓪,withPost1:= TRUE;⓪*ELSIF is ('POSTAMBLE2') THEN⓪,Split (arg,PosLen (' ',arg,0),postAmble2,postArgs2,strVal);⓪,delSpc (postArgs2);⓪,withPost2:= TRUE;⓪*ELSIF is ('LOAD') THEN⓪,IF load THEN⓪.IF NOT tell THEN TellLoading (initTell, ''); tell := TRUE END;⓪.TellLoading (newTellValue, arg);⓪.LoadModule (arg, StdPaths, callMsg (* dummy *), callMsg,⓪:callRes);⓪,END⓪*ELSIF is ('UNLOAD') THEN⓪,IF load THEN⓪.UnLoadModule (arg, callRes)⓪,END⓪*⓪*ELSIF is ('LINKSTACKSIZE') THEN⓪,getLC (LinkerParm.linkStackSize);⓪*ELSIF is ('NO_OPTIMIZE') THEN⓪,LinkerParm.optimize:= noOptimize ⓪*ELSIF is ('NAME_OPTIMIZE') THEN⓪,LinkerParm.optimize:= nameOptimize ⓪*ELSIF is ('PART_OPTIMIZE') THEN⓪,LinkerParm.optimize:= partOptimize ⓪*ELSIF is ('FULL_OPTIMIZE') THEN⓪,LinkerParm.optimize:= fullOptimize ⓪*ELSIF is ('DRIVER') THEN⓪,setLinkName (arg)⓪*ELSIF is ('DELETEDRIVERS') THEN⓪,SysUtil0.ClearVar (LinkerParm.linkList);⓪ ⓪H(*  comp./link/make  *)⓪*ELSIF is ('COMPILE') THEN⓪,autoCmd:= noCmd;⓪,unTell;⓪,callComp (arg, FALSE, TRUE, cont)⓪*ELSIF is ('MAKE') THEN⓪,autoCmd:= noCmd;⓪,unTell;⓪,callMake (arg, TRUE, cont)⓪*ELSIF is ('LINK') THEN⓪,autoCmd:= noCmd;⓪,unTell;⓪,callLink (arg)⓪*ELSIF is ('EDIT') THEN⓪,autoCmd:= noCmd;⓪,unTell;⓪,callEdit (arg, FALSE)⓪H(*  paths  *)⓪*ELSIF is ('SETDIR') THEN⓪,SetCurrentDir (defaultDrv, arg, voidI);⓪*ELSIF is ('SETDRIVE') THEN⓪,SetDefaultDrive (StrToDrive (arg))⓪*ELSIF is ('SETPATH') THEN⓪,SetDefaultPath (arg, voidI)⓪ ⓪*ELSIF is ('DEFAULTPATH') THEN⓪,setP ( StdPaths );⓪*ELSIF is ('DEFPATH') THEN⓪,setP ( DefPaths );⓪,getFirstPath (DefPaths, DefOutPath);⓪*ELSIF is ('IMPPATH') THEN⓪,setP ( ImpPaths );⓪,getFirstPath (ImpPaths, ImpOutPath);⓪*ELSIF is ('MODPATH') THEN⓪,setP ( ModPaths );⓪,getFirstPath (ModPaths, ModOutPath);⓪*ELSIF is ('SOURCEPATH') THEN⓪,setP ( SrcPaths )⓪*ELSIF is ('DEFOUT') THEN⓪,Assign (arg, DefOutPath, voidO);⓪,ValidatePath (DefOutPath)⓪*ELSIF is ('IMPOUT') THEN⓪,Assign (arg, ImpOutPath, voidO);⓪,ValidatePath (ImpOutPath)⓪*ELSIF is ('MODOUT') THEN⓪,Assign (arg, ModOutPath, voidO);⓪,ValidatePath (ModOutPath)⓪*ELSIF is ('MAINOUTPUTPATH') THEN⓪,Assign (arg, MainOutputPath, voidO);⓪,ValidatePath (MainOutputPath);⓪*END;⓪(⓪(END;⓪(⓪&UNTIL EOF (f) OR NOT cont;⓪&Close (f);⓪ ⓪&(* getFirstPath-Aufrufe hier weg und oben eingefügt *)⓪ ⓪$END;⓪$unTell;⓪$ShowArrow;⓪"END ExecuteBatch;⓪ ⓪ VAR     level   : CARDINAL;⓪ ⓪ PROCEDURE envlpProc (start, inChild:BOOLEAN; VAR i:INTEGER);⓪ ⓪"BEGIN⓪$IF ~inChild THEN⓪&IF start THEN⓪(IF level = 0 THEN⓪*IF shellParm.breakActive THEN voidO:=EnableBreak () END⓪(END;⓪(INC (level);⓪&ELSE⓪(DEC (level);⓪(IF level = 0 THEN⓪*IF shellParm.breakActive THEN DisableBreak END;⓪(END;⓪&END⓪$END;⓪"END envlpProc;⓪"⓪"⓪ VAR     oldOpen : InOutBase.OpenProc;⓪(oldClose: InOutBase.ClsProc;⓪ ⓪ PROCEDURE myOpen (x, y: CARDINAL);⓪ ⓪"BEGIN⓪$IF NOT callSwitchedToTextMode THEN⓪&HideMouse;⓪&clrscr;⓪&curon;⓪$END;⓪$oldOpen (x, y);⓪"END myOpen;⓪ ⓪ PROCEDURE myClose;⓪ ⓪"BEGIN⓪$IF NOT callSwitchedToTextMode THEN⓪&curoff;⓪&ShowMouse⓪$END;⓪$oldClose;⓪"END myClose;⓪ ⓪ ⓪ VAR     err     : BOOLEAN;⓪(wsp     : MemArea;⓪(envlpHdl: EnvlpCarrier;⓪(ch      : CHAR;⓪(idx     : CARDINAL;⓪ ⓪ BEGIN (* Main of MShell *)⓪ ⓪"(*  ShellMsg - Variablen initialisieren⓪#*)⓪"Active:= TRUE;⓪"⓪"(*  Pfadlisten anlegen⓪#*)⓪"Lists.CreateList (StdPaths,err);⓪"Lists.CreateList (DefPaths,err);⓪"Lists.CreateList (ImpPaths,err);⓪"Lists.CreateList (ModPaths,err);⓪"Lists.CreateList (SrcPaths,err);⓪"FOR idx:= 1 TO MaxSearchPaths DO pathArray[idx].used:= FALSE END;⓪ ⓪"autoCmd:= noCmd;⓪"⓪"shellStart:= TRUE;⓪"⓪"IF InitSS () THEN⓪"⓪$(*  Kontrolle gestarteter Prozesse zur Ctrl-C - Aktivierung⓪%*)⓪$SetEnvelope (envlpHdl, envlpProc, wsp);⓪$⓪$(*  Link into 'InOutBase' driver procs⓪%*)⓪$oldOpen := InOutBase.OpenWdw;⓪$InOutBase.OpenWdw := myOpen;⓪$oldClose := InOutBase.CloseWdw;⓪$InOutBase.CloseWdw := myClose;⓪$⓪$shellStart:= FALSE;⓪$(*$? UseExtKeys: InstallKbdEvents; *)⓪$TalkWithUser;               (* Hauptschleife der Shell *)⓪$(*$? UseExtKeys: DeInstallKbdEvents; *)⓪ ⓪$IF withPost1 THEN⓪&call (postAmble1, postArgs1, 0L, FALSE, TRUE, FALSE);⓪$END;⓪$IF withPost2 THEN⓪&call (postAmble2, postArgs2, 0L, FALSE, TRUE, FALSE);⓪$END;⓪ ⓪$InOutBase.OpenWdw := oldOpen;⓪$InOutBase.CloseWdw := oldClose;⓪ ⓪$(* eigenen Namen löschen, damit GEMINI die Shell nicht nochmal startet *)⓪$IF DoShellWrite & (GEMEnv.GEMVersion () >= $140) THEN⓪&IF NOT multiTOS THEN⓪(AESMisc.ShellWrite (FALSE, AESMisc.graphicPrgm, '', '');⓪&END⓪$END;⓪ ⓪$ExitSS;⓪ ⓪"ELSE⓪$TermProcess (fInsufficientMemory)⓪"END;⓪"⓪ END MM2TinyShell.⓪ ə
  2. (* $000096BA$FFEE34BD$000126F0$000171BA$FFF7016F$FFF7016F$FFF7016F$FFF7016F$FFF7016F$FFEC1D4A$FFF7016F$000001C2$FFF7016F$0001A06C$FFF7016F$FFEC67A7$FFF7016F$00005FE8$FFED6C22$FFF7016F$FFED6C22$00011614$FFF7016F$FFF7016F$FFF64330$00002098$FFE96D50$FFF7016F$FFF7016F$00014F4A$FFF7016F$FFF7016F$FFF7016F$FFF7016F$FFE96809$0001159C$FFEE34BD$FFF7016F$00004278$0000723D$FFF7016F$FFF7016FÇ$000029C4T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00000C82$00002FC6$000029C4$0000A2FA$000001C2$00001493$000001C2$00000781$000001C2$FFDEC118$0000A61B$0000A5CE$0000A5B0$000029C4$FFE18A32$00000C59£Çâ*)
  3.